【问题标题】:Apache Pig: filter based on tupple member contentApache Pig:基于元组成员内容的过滤器
【发布时间】: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 作为结果。

提前感谢您的帮助!

【问题讨论】:

    标签: hadoop apache-pig


    【解决方案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)})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多