pig:什么是正确的语法来扁平嵌套包(2层深)

63lcw9qa  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(290)

我正在加载此数据:

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 元组,但我得到一个类似的错误。有人能帮我正确的语法吗?

fwzugrvs

fwzugrvs1#

你需要使用things.thing,things.d1,thangs.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。但是像open和div这样的字段是不需要的,因为没有歧义。

相关问题