2

次の単純な豚のスクリプトがあります。

AA = LOAD 'A' USING PigStorage(',') as (f1,f2,f3);
BB = LOAD 'B' AS (f1);
C = foreach AA generate f1;
C = JOIN AA BY f1 LEFT OUTER, BB BY f1 using 'replicated';
D = FOREACH C GENERATE FLATTEN((IsEmpty(AA) ? null : AA));
store D into 'd';

しかし、実行すると、次のエラーが表示されます。

無効なスカラー射影: AA : 列をスカラーとして使用するには、リレーションから射影する必要があります

助けていただけますか?

ベスト、サラ

4

1 に答える 1

2

IsEmptyのドキュメントによると:

,,バッグまたはマップが空かどうかを確認します"

あなたの場合、 CAAおよびBBからのフィールドを持つ 1 つのタプル/行を含む 1つの外側のバッグであるため、機能しません。

C: {AA::f1: int,AA::f2: chararray,AA::f3: chararray,BB::f1: int}

代わりにAAの各フィールドにBincond演算子を適用して、値をチェックして置換することができます。次に例を示します。

D = foreach C generate (AA::f1 is null ? '-1' : AA::id) ... ;

ただし、IsEmpty に固執する場合は、次のようにします。

D = foreach C {
 bg = TOBAG(TOTUPLE(AA::f1,AA::f2,AA::f3));
 generate IsEmpty(bg) ...;
}

注:
Pig のドキュメントの IsEmpty セクションにタイプミスがあると思います。 前の例では、cogroup使用して 2 つのリレーションを結合し、IsEmpty を操作できるインナー バッグを作成しました。後でこれは左結合に置き換えられ、説明したのと同じ問題が発生します。

于 2013-02-16T18:18:26.430 に答える