Pig:在Pig中为现有的内部元组添加新列

时间:2016-10-11 08:36:52

标签: apache-pig

我想在Pig中为现有的元组列添加新列。

示例:输入架构:

name: chararray,
attribute_list: {innertuple: (height: int,length: int,size: chararray)}

输出架构: 使用generate语句我想在元组中添加新列,它将保持与length相同的值,但带有其他名称。

name: chararray,
attribute_list: {innertuple: (height: int,length: int,size: chararray, len : int)}

我尝试了以下方法,但它不起作用:

op = Foreach input_data generate
name,
attribute_list as attr : {(
height,
length,
size,
length as len)};

请建议。 提前致谢

2 个答案:

答案 0 :(得分:0)

选项1:

为每一行添加排名,展平attribute_list包,然后使用其他列重新创建包。

--Rank input_schema(ip) using rank function:

ranked= rank ip;

-- flatten each value of bag.tuple to row level  
a= foreach ranked generate rank_ip as id, flatten(attribute_list.$0), flatten(attribute_list.$0.length) as len;

b= group a by id;

op= foreach b generate flatten($1.name) as name, $1 as attr;

--The name also will be part of attr bag. 

选项2:

一个。 DataFu有一个猪udf来连接多个元组周围的元组    湾创建UDF BagConcat。

define BagConcat datafu.pig.bags.BagConcat();

℃。拼合元素:

a= foreach ip generate name, flatten(attribute_list.$0), flatten(attribute_list.$0.length) as len;

d。重新投放你的行李:

op= foreach a generate name, BagConcat(height,len,size,len) as attr;

答案 1 :(得分:0)

A = LOAD 'PATH' USING PigStorage() AS (ID:INT);
B = FOREACH sourcenew GENERATE *, null as len:int;

您也可以提供任何整数值来代替null。