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

AfwHS Summarize

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


概要

Summarizeは、データの集計を行うもの。
キー毎に合算やカウント・最大値・最小値算出を行う。

AsakusaFWのDMDLで集計方法を記述して、AfwHSで使用する。


Summarizeの使用方法

s0.summarize[出力モデル](名前) { 処理 }

↓AsakusaFW

@Summarize
public abstract 出力モデル 名前(入力モデル);
AfwHS 備考
s0 Source 入力ソースとなるデータ。
名前 String 演算子の名前。
入力モデル データモデルクラス 入力データのクラス名。AfwHSではs0によって自動的に決まる。
出力モデル データモデルクラス 出力データのクラス名。
処理 (入力モデル)=>出力モデル 集計処理を行う関数(AfwHS専用)。

AsakusaFWではDMDLでどういう集計を行うかを記述するので、Operatorクラスでは処理本体(集計内容)を書く必要は無い。
しかしAfwHSでは(実際の動作させる都合で)演算内容自体が必要となるので、“処理”を渡す必要がある。
ただしDMDLからAfwHSのラッパークラスを生成する際に一緒に処理も生成しているので、その関数を渡せばよい。
この“処理”(関数)はAsakusaFWに変換した後には使われない。(例えばCoGroupではAsakusaFW上で動作するときに“処理”が実際に呼ばれる)


Summarizeの使用例

DMDLの例

summarized word_count_total = word_count_model => {
  any   word  -> word;
  count count -> count;
} % word;

AfwHSのソース:

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メソッドに型引数を指定する必要は無い。

WordCountTotalWrapperのソース(抜粋):

object WordCountTotalWrapper {
〜
  def summarize(d: WordCountTotal, s: WordCountModel) {
    d.setWordAsString(s.getWordAsString())
    if (d.getCountOption().isNull) d.setCount(1) else d.getCountOption().add(1)
  }
}

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