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

Posted

技术标签:

【中文标题】Apache Pig:基于元组成员内容的过滤器【英文标题】:Apache Pig: filter based on tupple member content 【发布时间】:2014-11-12 13:31:01 【问题描述】:

我正在学习 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 作为结果。

提前感谢您的帮助!

【问题讨论】:

【参考方案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);

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

【讨论】:

弗雷德,我想发布相同的解决方案,但您在 2 分钟前发布。时机非常重要。 +1。 嗨@Fred,感谢您的快速回答。我认为我们已经接近这里的解决方案,但您误解了部分问题(可能不够清楚)。我正在编辑问题以添加一个示例,这将使问题更加清晰。 过程几乎相同,但我会编辑答案 你好@Fred。感谢您澄清这一点,现在我完全理解了这背后的逻辑,并且能够得到我想要的。我确实修改了你的建议:我测试 PATTERN_B 是否在这里,然后我过滤 cnt2==0。这是最后的命令行: C = FOREACH MLSET_1 F1 = FILTER MLSET BY (text == PATTERN_A); F2 = FILTER MLSET BY(文本 == PATTERN_B);生成组, COUNT(F1) AS cnt1, COUNT(F2) AS cnt2;; D = 过滤 C BY (cnt1 >= 1 AND cnt2 == 0);【参考方案2】:

这里是另一种方法

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))

【讨论】:

以上是关于Apache Pig:基于元组成员内容的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

计算过滤的值 - Apache PIG

无法在 Apache Pig 中过滤 NULL 值

在 Apache Pig 中过滤数据

如何使用 apache Pig 插入过滤数据的索引?

pig:过滤掉空字符串

在 Pig 中投影分组元组