在 Pig 中过滤

Posted

技术标签:

【中文标题】在 Pig 中过滤【英文标题】:Filtering in Pig 【发布时间】:2012-04-25 11:00:01 【问题描述】:

我正在尝试对 pig 中的关系进行过滤,我需要所有在第一个字段字符串中出现第三个字段的记录。

我尝试过: (假设我的源关系是 SRC)

Filtered= FILTER SRC BY $0 matches 'CONCAT(".*",$2,".")';
DUMP Filtered;

没有语法错误,但我没有得到 Filtered 的任何输出。

【问题讨论】:

【参考方案1】:

Pig 的CONCAT 只接受两个参数。请参阅http://pig.apache.org/docs/r0.10.0/func.html#concat的文档

我不确定为什么它在运行时没有抱怨,但你会想要将两个 CONCAT 语句串在一起,比如

CONCAT(".*", CONCAT($2, "."))

得到你想要的字符串。

【讨论】:

【参考方案2】:

我不认为 CONCAT 正在解决您所期望的问题,因此匹配项可能会尝试匹配整个未评估的字符串 CONCAT(".*",$2,"."),这就是您没有得到任何结果的原因

您能否将其分解为两个语句,第一个语句创建一个包含 CONCAT 评估内容的字段,第二个语句执行匹配操作:

TMP = FOREACH SRC GENERATE $0, CONCAT(".*",$2,".");
Filtered = FILTER TMP BY $0 matches $1;
DUMP Filtered;

或者类似的东西(完全未经测试)

【讨论】:

【参考方案3】:

我认为你只是有一些语法错误

正如 A. Leistra 所指出的,CONCAT 只接受两个参数。 “。”如果你想要双面通配符,最后应该是“.*” FILTER 语句更喜欢在参数周围使用括号 Pig 有很多奇怪的边缘情况涉及双引号,所以尽可能使用单引号

Filtered= FILTER SRC BY ($0 matches CONCAT('.*', CONCAT($2, '.*')));

【讨论】:

【参考方案4】:

试试这个,

Filtered= FILTER SRC BY $0 matches '(.*)$2(.*)';

DUMP Filtered;

如果第三个字段包含第一个字段,则该结果将被过滤。 这是通过使用正则表达式完成的。

【讨论】:

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

在 Hadoop/Pig 中使用匹配过滤

在 Apache Pig 中过滤数据

如何在 Pig 中过滤 Cassandra TimeUUID/UUID

在 Pig 中使用多个条件过滤列

pig:过滤掉空字符串

通过在 PIG 中的同一块内计算的条件值在 FOREACH 块内进行过滤