是否可以交叉连接与Pig中该行中元组的关系中的行?

时间:2011-09-13 18:16:21

标签: apache-pig cross-join

我有一组数据显示用户,他们喜欢的水果集合以及家乡城市:

Alice\tApple:Orange\tSacramento
Bob\tApple\tSan Diego
Charlie\tApple:Pineapple\tSacramento

我想创建一个猪查询,它关联在不同城市享受水果的用户数量,其中上述数据查询的结果如下所示:

Apple\tSacramento\t2
Apple\tSan Diego\t1
Orange\tSacramento\t1
Pineapple\tSacramento\t1

我无法弄清楚的部分是如何将拆分水果行与来自同一行的其余数据交叉连接,所以:

Alice\tApple:Orange\tSacramento

变为:

Alice\tApple\tSacramento 
Alice\tOrange\tSacramento

我知道我可以使用TOKENIZE将字符串'Apple:Orange'分成元组('Apple','Orange'),但我不知道如何将该元组的交叉产品与其余部分一起使用行('爱丽丝')。


我提出的一个暴力解决方案是使用流来通过外部程序运行输入集合,并处理“交叉连接”以在那里每行产生多行。

这似乎应该是不必要的。还有更好的想法吗?

1 个答案:

答案 0 :(得分:1)

你应该使用FLATTEN,它与TOKENIZE很有效,可以做这样的事情。

b = FOREACH a GENERATE name, FLATTEN(TOKENIZE(fruits)) as fruit, city;

FLATTEN需要一个包,然后“平展”#34;它横跨不同的行。 TOKENIZE将你的水果分成一个袋子(不是你说的那样的元组),然后FLATTEN就像你正在寻找的十字架行为一样。我指出它是一个包而不是一个元组,因为FLATTEN被重载并且与元组的行为不同。

我首先在规范字数统计示例中了解了FLATTEN / TOKENIZE技术,其中将字标记化,然后将字拼接成行。