Apache Pig:基于元组成员内容的过滤器

时间:2014-11-12 13:31:02

标签: hadoop apache-pig

我正在学习Apache Pig并遇到了一个问题,以实现我的愿望。 我有这个对象(在做一个GROUP BY之后):

MLSET_1: {group chararray,MLSET: {(key: chararray, text: chararray)}}

我想仅在文本中出现某个模式(PATTERN_A)时才生成密钥,而另一个模式(PATTERN_B)没有出现在一个密钥的文本字段中。

我知道我可以使用MLSET.text来获取特定键的所有文本值的问题但是我仍然遇到有关如何过滤元组中的项列表的相同问题。

以下是一个例子:

(key_A,{(key_A,start),(key_A,stop),(key_A,unknown),(key_A,whatever)})
(key_B,{(key_B,stop),(key_B,whatever)})
(key_C,{(key_C,start),(key_C,stop),(key_C,whatever)})

我想获取显示“开始”和未显示“未知”的行的键。在这个例子中,我将只得到key_C。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

以下是一些可能会帮助您的代码。解决方案是嵌套的foreach:

C = FOREACH MLSET_1 {F1 = FILTER MLSET BY (text == PATTERN_A); F2 = FILTER MLSET BY (text != PATTERN_B); GENERATE group, COUNT(F1) AS cnt1, COUNT(F2) AS cnt2;};
D = FILTER C BY (cnt1 > 1 AND cnt2 == 0);

您可能必须在嵌套过滤器中调整比较。

答案 1 :(得分:0)

这是另一种方法

C = FOREACH MLSET_1 GENERATE $0,$1,BagToString(MLSET.(key,text));
D = FILTER C BY ($2 MATCHES '.*start.*') AND NOT($2 MATCHES '.*unknown.*');
E = FOREACH D GENERATE $0,$1;
DUMP E;

以上输入的输出:

(key_c,{(key_c,start),(key_c,stop),(key_c,whatever)})