在 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
...
应减少预期的输出关系,并且仅包括 Id
和 Num == 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
,但在我的情况下,有不同的IDs
与Num==300
匹配。
@MathProgrammer 在这种情况下,您必须使用 JOIN 而不使用限制 1。Join 将匹配所有 id。以上是关于在 Apache Pig 中过滤数据的主要内容,如果未能解决你的问题,请参考以下文章
Apache Pig 中的 HCatalog 可以只加载特定分区吗?