0

我有一个看似非常简单的问题,但我似乎无法弄清楚。

我有看起来像这样的数据:

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,但它没有用。

我已经坚持了很长一段时间,任何帮助将不胜感激。谢谢!

4

1 回答 1

0

有两个问题,一个你不能命名你的变量组,因为这是一个保留字,两个你匹配的是字符串“(chararray)id”,而不是id。

此外,IMO 我认为永远不要按索引分配变量,而只是在加载语句中定义它们,如果这样做,您可以删除 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(',');

对此进行了测试,它有效。

于 2013-04-21T21:01:34.590 回答