0

私はこのデータをロードしています:

data6 = 'item1' 111 { ('thing1', 222, {('value1'),('value2')}) }

このコマンドの使用

A = load 'data6' as ( item:chararray, d:int, things:bag{(thing:chararray, d1:int, values:bag{(v:chararray)})} );

このコマンド全体を平らにしようとしています。

A_flattened = FOREACH A GENERATE item, d, things::thing AS thing; things::d1 AS d1, FLATTEN(things::values) AS value;

しかし、私はこのエラーを受け取ります:

Invalid field projection. Projected field [things::thing] does not exist in schema: item:chararray,d:int,things:bag{:tuple(thing:chararray,d1:int,values:bag{:tuple(v:chararray)})}

内側のthingsタプルに名前を付けてみましたが、同様のエラーが発生します。誰かがここで正しい構文を教えてくれますか?

4

1 に答える 1

3

バッグに射影したいので、 things.thing 、 things.d1thangs.values使用する必要があります。#はmap 上の投影で使用されます。

バッグ プロジェクションの紹介です(このページで「バッグ プロジェクション」を検索してください): http://ofps.oreilly.com/titles/9781449302641/intro_pig_latin.html

::は、同じフィールド名を持ついくつかの入力を結合するときに名前の競合を回避するために使用されます。joinは、渡された入力のフィールドの名前を保持します。また、フィールドの元となったリレーションの名前を先頭に追加し、その後に::を付けます。例えば、

-- join2key.pig
daily = load 'NYSE_daily' as (exchange, symbol, date, open, high, low, close,
            volume, adj_close);
divs  = load 'NYSE_dividends' as (exchange, symbol, date, dividends);
jnd   = join daily by (symbol, date), divs by (symbol, date);

jndの説明は次のとおりです。

jnd: {daily::exchange: bytearray,daily::symbol: bytearray,daily::date: bytearray,
daily::open: bytearray,daily::high: bytearray,daily::low: bytearray,
daily::close: bytearray,daily::volume: bytearray,daily::adj_close: bytearray,
divs::exchange: bytearray,divs::symbol: bytearray,divs::date: bytearray,
divs::dividends: bytearray}

フィールド名がレコード内で一意でなくなっていない限り、daily:: プレフィックスを使用する必要はありませんこの例では、結合後に日付フィールドのいずれかを参照する場合は、daily::dateまたはdivs:: date を使用する必要があります。しかし、あいまいさがないため、opendivなどのフィールドは使用しません。

于 2013-05-27T10:56:34.250 に答える