我是新来的ApachePig。我想把下面的输入分解成我所需要的输出,就像所有人都看到了那个产品一样。
我的输入:(userid,productid)
12345 123456,23456,987653
23456 23456,123456,234567
34567 234567,765678,987653
我需要的输出:(productid,userid)
123456 12345
123456 23456
23456 12345
23456 23456
987653 12345
987653 34567
234567 23456
234567 34567
765678 34567
我的Pig脚本:
a = load '/home/hadoopuser/ips' using PigStorage('\t') as (key:chararray, val:chararray);
b = foreach a generate key as ky1, FLATTEN(TOKENIZE(val)) as vl1;
c = group b by vl1;
d = foreach c generate group as vl2, $1 as ky2;
e = foreach d generate vl2, BagToString(ky2) as kyy;
f = foreach e generate vl2 as vl3,FLATTEN(STRSPLIT(kyy,'_')) as ky3;
g = foreach f generate vl3, FLATTEN(TOKENIZE(ky3)) as kk1;
dump g;
我得到了以下输出,消除了重复(重复)的值,
(23456,12345)
(123456,12345)
(234567,23456)
(765678,34567)
(987653,12345)
我不知道怎么解决这个问题。有人能帮我解决这个问题吗?如何以一种简单的方式做到这一点?
1条答案
按热度按时间zujrkrfu1#
好吧,代码的第二行正是您想要的,它只是首先显示客户,然后显示产品。把这个放在第一位
FLATTEN
然后是key
零件:至于为什么在当前代码中每个productid只能得到一个结果,您是按productid分组的,这将为每个不同的代码提供一行
ProductId
带着一个袋子,里面装着所有看过那个产品的顾客。然后,你把那个袋子变成一根巨大的绳子_
,将其再次转换为与以前相同的包:这个
BagToString
udf将包转换为字符串,将包中的不同值连接起来,并用自定义分隔符分隔,默认为_
. 但是,在下一行中,您将其拆分为_
结果和以前一样。然而,你FLATTEN
这个包,所以现在不再有productid和bag的行,而是有几个字段的行,第一个是productid,下面是查看产品的所有客户的字段:展平前:
展平后:
错误就在这里。对于每个产品,您只有一行,对于每个客户,每行中有几个字段。应用最后一个
foreach
,则选择第一个字段(产品)和第二个字段(所有客户中的第一个),丢弃每行上的其余客户。