Asakusa FrameworkをScalaで記述するAfwHS α版のFoldについて。
|
Foldは、データの畳み込みを行うもの。
集約キー毎に要素(データ)同士を演算(集計など)して1つにまとめる。
Summarizedは、集計を行って別のデータモデルを出力する。
Foldは同じデータモデル内で集計を行い、そのデータモデルを返す。
s0.fold(名前, キー) { 処理 }
↓AsakusaFW
@Fold public void 名前(キー left, right){ 処理 }
AfwHS | 備考 | |
---|---|---|
s0 | Source | 入力ソースとなるデータ。 |
名前 | String | 演算子の名前。 |
キー | Key | 集約キー。 |
left | データモデルクラス | 集約結果を保持するデータモデル。 |
right | データモデルクラス | 演算対象となるデータモデル。 |
処理 | (left, right)=>Unit | 集計処理を行う関数。 |
この“処理”(関数)は、AsakusaFW(Hadoop)で実際にMapReduceが動く際に呼ばれる。
import scala.collection.JavaFolders._ 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._
例 | 備考 |
---|---|
val sum = words.fold("sum3", "word") {
(left, right) =>
val wl = left.asScala
val wr = right.asScala
wl.count += wr.count
}
↓等価なAsakusaFW @Fold
public void sum3(@Key(group={"word"}) WordCountModel left, WordCountModel right) {
left.setCount(left.getCount() + right.getCount());
}
|
foldでは、rightの値をleftに反映させていく。 例えばrightのフィールドをleftのフィールドに合算する。 最終的にleftが出力される。 これはキー毎に行われるので、集約キーを指定する。 AfwHSでもAsakusaFW(Java)の例と同じように left・rightのセッター・ゲッターを使って書けるが、 asScalaでScalaのラッパークラスに変換すると 「+=」演算子で合算処理が書けて分かりやすい。 |