我有一组数据显示用户,他们喜欢的水果集合以及家乡城市:
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'),但我不知道如何将该元组的交叉产品与其余部分一起使用行('爱丽丝')。
我提出的一个暴力解决方案是使用流来通过外部程序运行输入集合,并处理“交叉连接”以在那里每行产生多行。
这似乎应该是不必要的。还有更好的想法吗?
答案 0 :(得分:1)
你应该使用FLATTEN
,它与TOKENIZE
很有效,可以做这样的事情。
b = FOREACH a GENERATE name, FLATTEN(TOKENIZE(fruits)) as fruit, city;
FLATTEN
需要一个包,然后“平展”#34;它横跨不同的行。 TOKENIZE
将你的水果分成一个袋子(不是你说的那样的元组),然后FLATTEN
就像你正在寻找的十字架行为一样。我指出它是一个包而不是一个元组,因为FLATTEN
被重载并且与元组的行为不同。
我首先在规范字数统计示例中了解了FLATTEN
/ TOKENIZE
技术,其中将字标记化,然后将字拼接成行。