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() );