在猪群中由元组组成

时间:2015-06-25 08:43:02

标签: tuples apache-pig

我一直坚持这个问题。我有一个如下所示的数据文件:

(1,N,N,5,High,H,House,d)
(1,N,N,6,High,H,House,a)    
(2,N,N,10,Low,H,House,t)    
(2,N,N,11,Medium,H,House,e)

我希望我的输出格式如下。我可以使用Pig ???

来实现它
{1,(N,N),{(5,High),(H,House),d},{(6,High),(H,House),a}}

{2,(N,N),{(10,Low),(H,House),t}{(11,Medium),(H,House),e}}

我实际上尝试将其分组为第一列。

datafile = LOAD '/user/zbc/xyz.txt' USING PigStorage() AS (id:int, 
    flag1:chararray, flag2:chararray, typcode:chararray, typ_name:chararray, 
    groupcode:charray, groupname:chararray, date:chararray);

collected = FOREACH datafile Generate TOBAG(gst_id, TOTUPLE(flag1,flag2), 
TOBAG(TOTUPLE(typcode, typname), TOTUPLE(groupcode, groupname), date));

我没有得到进一步的进展。按"一个字段和一个元组分组"。

1 个答案:

答案 0 :(得分:2)

嗯,你是在正确的方向,但你自己创造袋子,而不是让猪在分组时这样做。加载数据后,简化第二步,只创建所需的元组,两个标志的组合:

collected = FOREACH datafile Generate id, TOTUPLE(flag1, flag2), $3..;

$3..告诉Pig从第四个开始(从$0开始),因此您不必重复整个参数列表。现在你将拥有这个:

(1,(N,N),5,High,H,House,d)
(1,(N,N),6,High,H,House,a)
(2,(N,N),10,Low,H,House,t)
(2,(N,N),11,Medium,H,House,e)

现在,您可以使用group by运算符按所需字段的任意组合进行分组,在本例中为id和标记元组:

desired_output = group collected by (id, $1);

在此之后,您可以根据需要对数据进行分组:

((1,(N,N)),{(1,(N,N),6,High,H,House,a),(1,(N,N),5,High,H,House,d)})
((2,(N,N)),{(2,(N,N),11,Medium,H,House,e),(2,(N,N),10,Low,H,House,t)})

修改

如果您不希望分组的字段显示在最终包中,可以使用嵌套的foreach将其取出:

filtered_output = foreach desired_output {
    AUX = foreach collected generate $2..;
    generate group, AUX;
}

输出:

((1,(N,N)),{(6,High,H,House,a),(5,High,H,House,d)})
((2,(N,N)),{(11,Medium,H,House,e),(10,Low,H,House,t)})