hadoop在pig中的过滤

e0bqpujr  于 2021-06-21  发布在  Pig
关注(0)|答案(4)|浏览(371)

我正在尝试对pig中的关系进行筛选,我需要在第一个字段字符串中出现第三个字段的所有记录。
我尝试了:(假设我的源关系是src)

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

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

lx0bsm1f

lx0bsm1f1#

Pig的 CONCAT 只接受两个参数。请参阅上的文档http://pig.apache.org/docs/r0.10.0/func.html#concat
我不知道为什么它在运行时不抱怨,但是你会想把两个串在一起 CONCAT 陈述,比如

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

得到你想要的线。

eni9jsuy

eni9jsuy2#

试试这个,

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

DUMP Filtered;

如果第三个字段包含第一个字段,则该结果将被过滤。这是通过使用regex实现的。

5lwkijsr

5lwkijsr3#

我不认为concat解决了您所期望的问题,更重要的是,matches可能试图匹配整个未赋值的字符串 CONCAT(".*",$2,".") ,这就是为什么你没有得到任何结果
您能将其分成两个语句吗?第一个语句创建一个包含concat的evalulated内容的字段,第二个语句执行matches操作:

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

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

vnjpjtjt

vnjpjtjt4#

我想你只是有些语法错误
正如a所指出的。莱斯特拉,康卡特只接受两个论点。
如果需要双面通配符,结尾的“.”应该是“.*”
filter语句首选参数周围的括号
pig有很多奇怪的边缘案例,涉及双引号,所以尽可能使用单引号 Filtered= FILTER SRC BY ($0 matches CONCAT('.*', CONCAT($2, '.*')));

相关问题