如何在pig中的group函数之后创建一组值(hadoop)

xkftehaa  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(281)

假设我在file.txt中有一组值
a、 b、c级
a、 b、d
k、 我,m
k、 左,右
k、 我,o
我的代码是:
file=使用pigstorage(',')加载'file.txt';
events=foreach文件生成session\u id、user\u id、code、type;
gr=事件分组依据(会话id、用户id);
我有一套价值观:
((a,b),{(a,b,c),(a,b,d)})
((k,l),{(k,l,m),(k,l,n),(k,l,o)})
我想要:(a,b,(c,d))
(k,l,(m,n,o))
你知道怎么做吗?
向帕维尔问好

8aqjt8rx

8aqjt8rx1#

注意:你的问题前后矛盾。你说呢 session_id, user_id, code, typeFOREACH 行,但您有一个不提供值的pig存储。还有,那 FOREACH 有4个值,而示例数据只有3个值。我假设 type 不是为了回答你的问题。
在你的 gr 关系时,您将保留group by key(在本例中 (session_id, user_id) )在一个自动生成的元组中 group .
所以,第一步: gr2 = FOREACH gr GENERATE FLATTEN(group); 这会给你元组 (a,b) 以及 (k,l) . 你需要使用 FLATTEN 因为 group 是一个元组 session_id 以及 user_id 是单独的列。 FLATTEN 这是为你做的。
现在修改 gr2 线条也可以使用投影来梳理出第三个值:

gr2 = FOREACH gr GENERATE FLATTEN(group), events.code;
``` `events.code` 从所有的 `code` 价值观。 `events` 是分组元组包的名称(以原始关系命名)。
这应该给你:

(a, b, {c, d})
(k, l, {m, n, o})

需要注意的是,列表中的值是在一个包中,而不是像您要求的那样是在一个元组中。把它放在包中是正确的想法,因为包是一个变量列表,而元组不是。
其他建议:了解如何 `GROUP BY` 输出数据是我看到很多人在第一次使用pig时都在挣扎的事情。如果你觉得我的回答没有什么意义,我建议你花点时间真正理解 `GROUP BY` . 理解而不是认为它是魔法,从长远来看会有回报。

相关问题