次の表を利用できると想像してください。
A: { x: int, y: int, z: int, ...99 other columns... }
ここで、これをwhereにz
設定されるように変換し、結果のデータセットをとして保存します。NULL
x > y
B
これはメンテナンスの悪夢になるので、他のすべての列について明示的に言及することなく、それを実行したいと思います。
簡単な解決策はありますか?
次の表を利用できると想像してください。
A: { x: int, y: int, z: int, ...99 other columns... }
ここで、これをwhereにz
設定されるように変換し、結果のデータセットをとして保存します。NULL
x > y
B
これはメンテナンスの悪夢になるので、他のすべての列について明示的に言及することなく、それを実行したいと思います。
簡単な解決策はありますか?
この問題は、このJIRAで追跡されます 。PIG-1693「および残りのすべてのフィールド」を示すためにforeachに方法が必要です。
現在、私はあなたが言うことをするか、Zをロードせず、星の式で新しい列Zを追加するよりも簡単なことは何も知りません。
単列バッグに入れ子にして、後で平らにすることで、カラムの膨張の一部を落とすことができました。
それでも、それはちょっとしたハックのように感じます。そのため、カスケードを調査して、自分のシナリオにより適しているかどうかを確認しています。
シナリオを容易にする機能がPig0.9に追加されました。新しいプロジェクト範囲演算子(..)を使用すると、次の例のように、開始フィールド名や終了フィールド名を指定することで、フィールドの範囲を表すことができます。
結果=FOREACHsomeInput GENERATE field1、field2、null as field3、field4 ..;
上記の例では、field1/2/3/4は実際のフィールド名です。フィールドの1つはnullに設定され、他のフィールドはそのまま保持されます。
この「新しいApachePig0.9機能–パート3」の記事の詳細:http://hortonworks.com/blog/new-apache-pig-0-9-features-part-3-additional-features/
特定の問題を解決するには、おそらくFILTERとUNIONを実行して結果を結合する必要があります。
もちろん、列番号で列を選択することもできますが、何かを変更すると、それは簡単に悪夢になります。列名の方がはるかに安定していることがわかったため、次の解決策をお勧めします。
..
先頭または末尾の列(または列の間)を示すために使用できます。'MyCol'の値を'updatedvalue'に変更する場合は、次のようになります。
aliasAfter = FOREACH aliasBefore GENERATE
.. colBeforeMyCol, updatedvalue, colAfterMyCol ..;