我有一个看似非常简单的问题,但我似乎无法弄明白。
我的数据如下:
A (B, C, A)
B (X, Y, Z)
C (F, C, D)
我正在使用Pig latin来检查第一列中的文本是否出现在第二列中。
这是我现在的代码:
Labels = LOAD 'example.txt' USING PigStorage('\t');
Projected = FOREACH Labels GENERATE $0 AS id, $1 AS group;
X = FILTER Projected BY (group matches '.*(chararray)id.*');
STORE X INTO '/test' USING PigStorage(',');
我期待的输出是:
A (B, C, A)
C (F, C, D)
我也试过将“。*”连接到id但是没有用。
我已经坚持了很长一段时间,任何帮助都会非常感激。谢谢!
答案 0 :(得分:0)
有两个问题,一个是你不能命名你的变量组,因为那是一个保留字,两个你匹配字符串“(chararray)id”,而不是id。
另外IMO我认为从不通过索引分配变量更简洁,只是在你的load语句中定义它们,如果你这样做,你可以删除Projected别名。
Labels = LOAD 'example.txt' USING PigStorage('\t') AS
(id:chararray, stringvalue:chararray);
X = FILTER Labels BY (stringvalue matches CONCAT(CONCAT('.*',id),'.*'));
STORE X INTO '/test' USING PigStorage(',');
经过测试,它有效。