Scalding では、次のことを行う必要があります。
- 文字列フィールドを最初の 3 文字でグループ化する
edit-distance
メトリックを使用して、すべてのグループのすべてのペアの文字列を比較します ( http://en.wikipedia.org/wiki/Edit_distance )- レコードがある CSV ファイルに結果を書き込みます
string; string; distance
文字列をグループ化するには、次の例のように map
andを使用します。groupBy
import cascading.tuple.Fields
import com.twitter.scalding._
class Scan(args: Args) extends Job(args) {
val output = TextLine("tmp/out.txt")
val wordsList = List(
("aaaa"),
("aaabb"),
("aabbcc"),
("aaabccdd"),
("aaabbccdde"),
("aaabbddd"),
("bbbb"),
("bbbaaa"),
("bbaaabb"),
("bbbcccc"),
("bbbddde"),
("ccccc"),
("cccaaa"),
("ccccaabbb"),
("ccbbbddd"),
("cdddeee")
)
val orderedPipe =
IterableSource[(String)](wordsList, ('word))
.map('word -> 'key ){word:String => word.take(3)}
.groupBy('key) {_.toList[String]('word -> 'x) }
.debug
.write(output)
}
その結果、次のようになります。
['aaa', 'List(aaabbddd, aaabbccdde, aaabccdd, aaabb, aaaa)']
['aab', 'List(aabbcc)']
['bba', 'List(bbaaabb)']
['bbb', 'List(bbbddde, bbbcccc, bbbaaa, bbbb)']
['ccb', 'List(ccbbbddd)']
['ccc', 'List(ccccaabbb, cccaaa, ccccc)']
['cdd', 'List(cdddeee)']
aaa
さて、この例では、このリストのキーを持つ文字列の編集距離を計算する必要があります。
List(aaabbddd, aaabbccdde, aaabccdd, aaabb, aaaa)
このリストの「bbb」キーを持つすべての文字列の次:
List(bbbddde, bbbcccc, bbbaaa, bbbb)
等
独自の関数に置き換える必要があるすべてのグループのすべての文字列間の編集距離を計算するにはtoList
、どうすればよいですか? また、関数の結果を CSV ファイルに書き込むにはどうすればよいですか?
ありがとう!
アップデート
List
スカルディングからの入手方法はPipe
?
toList
別のものを返すだけPipe
なので、すべてを使用することはできません:
val orderedPipe =
IterableSource[(String)](wordsList, ('word))
.map('word -> 'key ){word:String => word.take(3)}
.groupBy('key) {_.toList[String]('word -> 'x) }
.combinations(2) //---ERROR! Pipe has no such method!
.debug
.write(output)