2

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

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

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

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

4

4 回答 4

4

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

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

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

得到你想要的字符串。

于 2012-09-13T18:44:22.923 回答
2

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

你能把它分成两个语句,第一个是你创建一个包含 CONCAT 评估内容的字段,第二个是执行匹配操作:

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

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

于 2012-04-25T12:46:06.357 回答
1

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

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

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

于 2014-04-17T05:04:44.197 回答
0

尝试这个,

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

DUMP Filtered;

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

于 2014-07-16T01:37:34.537 回答