我想在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)};
请建议。 提前致谢
答案 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。