S-JIS[2011-09-04] 変更履歴

AfwHS Fold

Asakusa FrameworkScalaで記述するAfwHS α版のFoldについて。


概要

Foldは、データの畳み込みを行うもの。
集約キー毎に要素(データ)同士を演算(集計など)して1つにまとめる。

Summarizedは、集計を行って別のデータモデルを出力する。
Foldは同じデータモデル内で集計を行い、そのデータモデルを返す。


Foldの使用方法

s0.fold(名前, キー) { 処理 }

↓AsakusaFW

@Fold
public void 名前(キー left, right){ 処理 }
AfwHS 備考
s0 Source 入力ソースとなるデータ。
名前 String 演算子の名前。
キー Key 集約キー。
left データモデルクラス 集約結果を保持するデータモデル。
right データモデルクラス 演算対象となるデータモデル。
処理 (left, right)=>Unit 集計処理を行う関数。

この“処理”(関数)は、AsakusaFW(Hadoop)で実際にMapReduceが動く際に呼ばれる。


Foldの使用例

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のラッパークラスに変換すると
「+=」演算子で合算処理が書けて分かりやすい。

使用方法へ戻る / AfwHS目次へ戻る / AsakusaFWへ戻る / 技術メモへ戻る
メールの送信先:ひしだま