我在这个问题上纠缠了一段时间。我有一个如下所示的数据文件:
(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条答案
按热度按时间tyky79it1#
好吧,你是在正确的方向,但你是创造自己的袋子,而不是让Pig做分组。加载数据后,简化第二步仅创建所需的元组,这两个标志的组合:
这个
$3..
告诉Pig从第四个开始(从$0
)这样就不必重复整个参数列表。现在您将拥有:现在,你可以用
group by
运算符按所需字段的任意组合进行分组,在本例中是按id
以及标志元组:在此之后,您可以根据需要将数据分组:
编辑
如果不希望分组依据的字段出现在最后一个包中,可以使用嵌套的foreach将其取出:
输出: