Asakusa FrameworkをScalaで記述するAfwHS α版のSummarizeについて。
|
Summarizeは、データの集計を行うもの。
キー毎に合算やカウント・最大値・最小値算出を行う。
AsakusaFWのDMDLで集計方法を記述して、AfwHSで使用する。
s0.summarize[出力モデル](名前) { 処理 }
↓AsakusaFW
@Summarize public abstract 出力モデル 名前(入力モデル);
AfwHS | 備考 | |
---|---|---|
s0 | Source | 入力ソースとなるデータ。 |
名前 | String | 演算子の名前。 |
入力モデル | データモデルクラス | 入力データのクラス名。AfwHSではs0によって自動的に決まる。 |
出力モデル | データモデルクラス | 出力データのクラス名。 |
処理 | (入力モデル)=>出力モデル | 集計処理を行う関数(AfwHS専用)。 |
AsakusaFWではDMDLでどういう集計を行うかを記述するので、Operatorクラスでは処理本体(集計内容)を書く必要は無い。
しかしAfwHSでは(実際の動作させる都合で)演算内容自体が必要となるので、“処理”を渡す必要がある。
ただしDMDLからAfwHSのラッパークラスを生成する際に一緒に処理も生成しているので、その関数を渡せばよい。
この“処理”(関数)はAsakusaFWに変換した後には使われない。(例えばCoGroupではAsakusaFW上で動作するときに“処理”が実際に呼ばれる)
summarized word_count_total = word_count_model => { any word -> word; count count -> count; } % word;
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 count = words.summarize("sum2")(WordCountTotalWrapper.summarize) ↓等価なAsakusaFW @Summarize public abstract WordCountTotal sum2(WordCountModel arg); |
WordCountTotalWrapper.summarizeはラッパークラスで定義されている関数。 DMDL定義から自動生成される。 この関数を使えば型推論が働くので、 words.summarize メソッドに型引数を指定する必要は無い。 |
object WordCountTotalWrapper { 〜 def summarize(d: WordCountTotal, s: WordCountModel) { d.setWordAsString(s.getWordAsString()) if (d.getCountOption().isNull) d.setCount(1) else d.getCountOption().add(1) } }