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

AfwHS Convert

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


概要

Convertは、データの変換を行うもの。
あるデータモデルを受け取り、何らかの演算を行って別のデータモデルを出力する。

いわば、Scalaのコレクションのmapメソッドと同じ。


Convertの使用方法

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

↓AsakusaFW

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

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


Convertの使用例

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側でインスタンス化するので、
関数の外で定義された変数はたぶん初期化されないので使えない。
関数内部で処理が閉じている必要がある。

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