在 Apache Pig 中过滤数据

Posted

技术标签:

【中文标题】在 Apache Pig 中过滤数据【英文标题】:Filtering Data in Apache Pig 【发布时间】:2017-06-13 22:52:41 【问题描述】:

嘿,我正在尝试过滤以下输入:

Id       Num
102369   100
623589   200
102369   300
103333   300
103333   100
...

应减少预期的输出关系,并且仅包括 IdNum == 300 之间现有关系的所有 ID - Num 关系:

Id     Num
102369 100
102369 300
103333 300
103333 100

我试过这样:

grouped = GROUP table BY Num;
filtered = FILTER grouped BY group == 300;
DUMP filtered;

但这不起作用。你能帮我解决这个问题吗?

亲切的问候。

【问题讨论】:

如果您的预期输出应该只包含 num==300 的记录,为什么您希望的输出中有两条记录 102369 100 102369 300? 实际上我想输出所有与Num==300相关的ID的Id - Num关系。 看下面的答案 【参考方案1】:

您应该获取具有 Num==300 的记录的 ID,然后将其用作过滤器。

假设所有 num==300 产生 1 个唯一值 102369

A = FILTER table BY (Num == 300);
B = LIMIT A 1; --This is to ensure you use only 1 value
C = FILTER table by B.$0;
DUMP C;

如果您有 num==300 的多个 id,则使用 JOIN

 A = FILTER table BY (Num == 300);
 B = JOIN table by Id,A BY A.$0;
 C = FOREACH B GENERATE B.$0,B.$1;
 DUMP C;

【讨论】:

好东西,对不起,我在主帖中调整了我的输入数据。因此,这不再起作用。您的解决方案仅适用于第一个匹配的ID,但在我的情况下,有不同的IDsNum==300 匹配。 @MathProgrammer 在这种情况下,您必须使用 JOIN 而不使用限制 1。Join 将匹配所有 id。

以上是关于在 Apache Pig 中过滤数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 apache Pig 插入过滤数据的索引?

大数据笔记(十八)——Pig的自定义函数

Apache Pig 中的 HCatalog 可以只加载特定分区吗?

Apache PIG - 使用百分比值对 foreach 中的分组数据进行采样

pig:过滤掉空字符串

计算过滤的值 - Apache PIG