ブタにネストされた関係のすべての列を投影する

私は、XとYの結合の結果である関係MY_RELを持っています:

MY_REL = {X::x1,X::x2,Y::y1,Y::y2}

そして私はやろうとした

Bla =       foreach MY_REL generate X;

嘔吐した豚:

ERROR 1000: Error during parsing. Scalars can be only used with projections

私はXを試しました:: *とそれをスロー:無効なエイリアスX.

醜い回避策:すべての列名を明示的に書くことに切り替えました。

Bla =       foreach MY_REL generate X::x1, X::x2;

すべてのXの列を生成する良い方法はありますか?

2

2 答え

JOIN を使用する代わりに、 COGROUP COGROUP は、 {X:{x1、x2}、Y:{y1、y2}} のような関係を作成します。したがって、次のことができます。

foreach MY_REL GENERATE FLATTEN(X);

それはそこにあるバッグなので、平坦化する必要があることに注意してください。

3
追加された
後で X のサイズが0より大きいところで FILTER をフィルタすると、 COGROUP に置き換えることができます。
追加された 著者 Donald Miner,
創造的な考え!しかし、この関係を作成したのはLEFT結合なので、COGROUPに置き換えることはできませんね。
追加された 著者 ihadanny,
魅力的に働いた。 PIGが JOIN / COGROUP を実行したときに、ファイルAからすべての行をグループ化してjoin-key =ガガ。ファイルAから2行、Bから3行、Aから0行、Bから0行があるかどうかは関係ありません。これはSQLの人々が<コード> FULL OUTER JOIN と呼ぶものです。 COGROUP を尋ねるなら、これで終わりです。 JOIN を尋ねると、PIGはファイルの1つに0行のグループをフィルタリングします。
追加された 著者 ihadanny,

JOINの前の列の名前がす​​べて異なる場合は、後でそのまま使用できます。

Bla =       foreach MY_REL generate x1 + y1, x2 + y2;

1つの競合がある場合は、元の接頭辞関係を使用する必要があります

Bla =       foreach MY_REL generate x1, x2, y1, Y:y1 AS y2;

An with the new Pig range PIG-1693

Bla =       foreach MY_REL generate ..$2, $3 AS y2;

And there is also some talks in PIG-2511

1
追加された
範囲演算子 '..'(Pig 0.9に入っています)を使用する場合はいいえ、そうでない場合は、後で保存したいすべての列をGENERATEに指定する必要があります。私は個人的には競合のない名前を選択するか、次のFOREACHのすべての列の名前を変更するだけです。
追加された 著者 Romain,
OK - 関係名で列を完全修飾する必要はありませんが、明示的に名前を付けなければなりません。
追加された 著者 ihadanny,
ありがとう!私は0.8を使用しているので、私はオレンジオクトパス
追加された 著者 ihadanny,