9

次のようなデータがある場合:

A = LOAD 'data' AS (a1:int,a2:int,a3:int);

DUMP A;
(1,2,3)
(4,2,1)

次に、A、A に対してクロス結合が行われます。

B = CROSS A, A;

DUMP B;
(1,2,3)
(4,2,1)

2 番目の A がクエリから最適化されるのはなぜですか?

情報: 豚のバージョン 0.11

==更新==

A を次のように並べ替えた場合:

C = ORDER A BY a1;
D = CROSS A, C;

これにより、正しいクロス結合が得られます。

4

2 に答える 2

14

davekは正しいです-それ自体との関係はできませんCROSS(または)。JOINこれを行う場合は、データのコピーを作成する必要があります。この場合、別のLOADステートメントを使用できます。パイプラインのさらに下流のリレーションでこれを実行する場合は、を使用して複製する必要がありますFOREACH

頻繁に使用するマクロがいくつかIMPORTあり、必要な場合に備えて、すべてのPigスクリプトでデフォルトで使用しています。1つはこの目的のためだけに使用されます。

DEFINE DUPLICATE(in) RETURNS out
{
        $out = FOREACH $in GENERATE *;
};

これは、パイプラインのどこでも複製が必要な場合に機能します。

A1 = LOAD 'data' AS (a1:int,a2:int,a3:int);
A2 = DUPLICATE(A1);
B = CROSS A1, A2;

A1A2が同一であっても、レコードが同じ順序であると想定することはできないことに注意してください。しかし、CROSSまたはを実行している場合JOIN、これはおそらく問題ではありません。

于 2013-03-06T21:49:53.527 に答える
10

目的を達成するには、データを2回ロードする必要があると思います。

すなわち

A1 = LOAD 'data' AS (a1:int,a2:int,a3:int);
A2 = LOAD 'data' AS (a1:int,a2:int,a3:int);
B = CROSS A1, A2;
于 2013-03-06T19:58:16.610 に答える