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:基于元组成员内容的过滤器的主要内容,如果未能解决你的问题,请参考以下文章