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.thingthings.d1thangs.values,因为您想在包上进行投影。#用于map上的投影。

下面是Bag projection的介绍(在本页搜索“Bag projection”): 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::datedivs::date 。但是诸如opendivs之类的字段你不需要,因为没有歧义。

于 2013-05-27T10:56:34.250 回答