我是pig脚本的新手,尝试修改一些现有的pig脚本,从日志文件中提取一些数据。
e、 g.我有两个日志文件,其中一个模式为:
message Class {
message Student {
optional int32 uid = 1;
optional string name = 2;
}
optional int32 cid = 1;
repeated Student students = 2;
}
加载后,我认为创建了一个包(比如bag1)(如果我错了,请纠正我):
bag1:
{
(uid1, {(cid11, name11), (cid12, name12), (cid13, name13), ...}),
(uid2, {(cid21, name21), (cid22, name22), (cid23, name23), ...}),
...
}
另一个日志文件很简单,结果包(bag2)是这样的。
bag2:
{
(name11),
(name13),
(name22),
...
}
我想要的是,如果行中包含bag2中的任何名称,则从bag1获取所有行,如:
result bag:
{
(uid1, (name11, name13)),
(uid2, (name22)),
}
我想我需要对这两个袋子做一些加入/过滤,但不知道怎么做。我尝试了下面这样的脚本片段,但它甚至不是一个有效的脚本。
res = FOREACH bag1 {
names = FOREACH students GENERATE name;
xnames = JOIN names by name, bag2 by name;
GENERATE cid, xnames;
};
FILTER res BY not IsEmpty(xnames);
任何人都可以。在剧本上给我点帮助?
1条答案
按热度按时间bpzcxfmw1#
你不能使用
JOIN
在嵌套的FOREACH
,可以尝试展平元组,然后将其与第二个表连接:内部联接将过滤行:
最后,按uid分组您将不会得到元组,尽管它们的大小不能不同,您将得到包: