1

我有一组数据显示用户、他们喜欢的水果集合和家乡:

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”),但我不知道如何获得该元组与行的其余部分的叉积( '爱丽丝')。


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

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

4

1 回答 1

1

你应该使用FLATTEN,它非常TOKENIZE适合做这样的事情。

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

FLATTEN拿一个袋子并将其“压平”在不同的行中。TOKENIZE把你的水果分成一个袋子(不是你说的元组),然后FLATTEN像你正在寻找的那样做交叉行为。我指出它是一个包而不是元组,因为FLATTEN它重载并且与元组的行为不同。

我首先在规范单词计数示例中了解了FLATTEN/TOKENIZE技术,其中将单词标记化,然后将单词展平成行。

于 2011-09-14T02:01:38.540 回答