【问题标题】:pig - split, lack of default or if/elsepig - 拆分,缺少默认值或 if/else
【发布时间】:2013-09-20 09:51:54
【问题描述】:

由于在 pig split 操作中没有 else 或 default 语句,执行以下操作的最优雅的方法是什么?我不喜欢复制粘贴代码。

SPLIT rawish_data
    INTO good_rawish_data IF (
    (uid > 0L) AND
    (value1 > 0) AND
    (value1 < 100) AND
    (value1 IS NOT NULL) AND
    (value2 > 0L) AND
    (value2 < 200L) AND
    (value3 >= 0) AND
    (value3 <= 300)),

    bad_rawish_data IF (NOT (
    (uid > 0L) AND
    (value1 > 0) AND
    (value1 < 100) AND
    (value1 IS NOT NULL) AND
    (value2 > 0L) AND
    (value2 < 200L) AND
    (value3 >= 0) AND
    (value3 <= 300)));

我想做类似的事情

SPLIT data
    INTO good_data IF (
    (value > 0)),
    good_data_big_values IF (
    (value > 100)),
    bad_data DEFAULT;

这样的事情有可能吗?

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    是的。查看SPLIT 的文档,您想使用OTHERWISE。例如:

    SPLIT data
        INTO good_data IF (
        (value > 0)),
        good_data_big_values IF (
        (value > 100)),
        bad_data OTHERWISE;
    

    所以你几乎明白了。 :)

    注意: SPLIT 可以在 good_datagood_data_big_values 中放入一行,例如,如果 value 是 150。我不知道这是不是你的想要,但无论如何你都应该意识到这一点。这也意味着bad_data 将只包含value 为0 或更少的行。

    【讨论】:

    • 重要提示:bad_data 不会包含值为空的行!您需要专门检查 null 否则这些行将被删除在此表达式中。
    【解决方案2】:

    您可以编写一个 IsGood() UDF 来检查所有条件。那你的猪简直了

    SPLIT data
        INTO good_data IF (IsGood(data))
             good_data_big_values IF (IsGood(data) AND value > 100)),
             bad_data IF (NOT IsGood(data))
    ;
    

    另一种选择可能是使用macro

    【讨论】:

    • 如果你使用recently从trunk中签出Pig,那么使用宏是一种选择,否则你可能会遇到麻烦。见:issues.apache.org/jira/browse/PIG-3239
    • 你确定可以这样使用IsGood(data)吗?您是否不必传递每个(相关)字段,例如IsGood(value, uid, etc.)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2021-09-20
    相关资源
    最近更新 更多