Asakusa FrameworkをScalaで記述するAfwHS α版のConvertについて。
|
Convertは、データの変換を行うもの。
あるデータモデルを受け取り、何らかの演算を行って別のデータモデルを出力する。
いわば、Scalaのコレクションのmapメソッドと同じ。
s0.convert[出力モデル](名前) { 処理 }
↓AsakusaFW
@Convert public 出力モデル 名前(入力モデル){ 処理 }
AfwHS | 備考 | |
---|---|---|
s0 | Source | 入力ソースとなるデータ。 |
名前 | String | 演算子の名前。 |
入力モデル | データモデルクラス | 入力データのクラス名。AfwHSではs0によって自動的に決まる。 |
出力モデル | データモデルクラス | 出力データのクラス名。 |
処理 | (入力モデル)=>出力モデル | 変換処理を行う関数。 |
この“処理”(関数)は、AsakusaFW(Hadoop)で実際にMapReduceが動く際に呼ばれる。
import scala.collection.JavaConverters._ import jp.hishidama.afwhs._ //モデルクラスとそのラッパークラスと暗黙変換をインポート import afws.wordcount.modelgen.dmdl.model.WordCountModel import afws.wordcount.modelgen.dmdl.model.WordCountModelWrapper import afws.wordcount.modelgen.dmdl.model.WordCountModelImplicit._ import afws.wordcount.modelgen.dmdl.model.WordCountTotal import afws.wordcount.modelgen.dmdl.model.WordCountTotalWrapper import afws.wordcount.modelgen.dmdl.model.WordCountTotalImplicit._
例 | 備考 |
---|---|
val (conv, _) = count.convert("convert") { arg => WordCountModelWrapper( ars.getWordAsString(), ars.getCount().toInt ).asJava } ↓等価なAsakusaFW private WordCountModel wc = new WordCountModel(); @Convert public WordCountModel convert(WordCountTotal arg) { wc.setWordAsString(arg.getWordAsString()); wc.setCount((int)arg.getCount()); return wc; } |
convertでは戻り値が2つある。 1つ目は変換結果で、2つ目は元のデータ。 Scalaでは使わないデータの変数名を「_」にすることが出来る。 (使われない出力データがある場合、AsakusaFWではstop演算子に渡さないとエラーになる。 そこで、AfwHSでは使われない出力データ(結線されないデータ)は無条件にstop演算子に出力するよう変換する) AsakusaFWではConvertの中でオブジェクト(左記のwc)は使い回すことが出来る。 しかしAfwHSでは関数をHadoop側でインスタンス化するので、 関数の外で定義された変数はたぶん初期化されないので使えない。 関数内部で処理が閉じている必要がある。 |