在 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 中过滤的主要内容,如果未能解决你的问题,请参考以下文章