cascadingの入出力宣言について■cascadingの入出力宣言について ■c
Pipe、および、Operationについて、入出力を宣言することができる。
詳細は以下参照。
http://www.ne.jp/asahi/hishidama/home/tech/apache/hadoop/cascading/Tuple.html#h_Fields
☆Operationの入力と出力で同じカラム名を使いたい場合。
(cascading-1.2.3で確認)
入力 Fields flds = new Fields( "col1", "col2" );
に対し、Each、Functionでcol1、col2の値を書き換え、
同じスキーマ(Fields)で出力したいとする。
この場合、正解は以下の通り。
・パイプの組み立て
pipe = new Each(pipe, new SomeFunc( flds ), Fields.RESULTS ); // SomeFunc の fieldDeclaration として flds を設定
pipe = new Each(pipe, new Fields( flds ), new Identity() );
なお、Eachについて outputSelector を省略すると Fields.RESULTS 扱いなので、Fields.RESULTS を省略してもよし。
・Operationの実装
入力のTupleEntry(funcCall.getArguments()で取得するやつ)を更新することはできない。
output 用の TupleEntry のインスタンスを作成し、演算結果はそっちにsetしてから OutputCollector に add しなければならない。
※「パイプの組み立て」について補足
以下は実行時エラー。関数の入力、出力に同じカラム名が存在し、outputSelectorにてどちらのことを指しているのか判別できない。
pipe = new Each(pipe, new SomeFunc( flds ), flds /*←outputSelector*/);
何故か以下もカラム名重複で実行時エラー。(謎・・・)
pipe = new Each(pipe, new SomeFunc( flds ), Fields.RESULTS ); // fieldDeclaration として flds を設定
pipe = new Each(pipe, new Identity(), flds );
※項目追加の場合
入力項目も一部残しながら、新たな項目も加わる場合。
例えば、以下の場合
入力 Fields fldsIn = new Fields( "col1", "col2" );
出力 Fields fldsOut = new Fields( "col2", "col3" );
は以下のようにすべし。
pipe = new Each(pipe, new SomeFunc( fldsOut ), Fields.RESULTS ); // SomeFunc の fieldDeclaration として flds を設定
pipe = new Each(pipe, new Fields( fldsOut ), new Identity() );