pig - 拆分,缺少默认值或 if/else

Posted

技术标签:

【中文标题】pig - 拆分,缺少默认值或 if/else【英文标题】:pig - split, lack of default or 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;

这样的事情有可能吗?

【问题讨论】:

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

以上是关于pig - 拆分,缺少默认值或 if/else的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PIG Script 中实现 IF ELSE 控制逻辑

python函数使用多个默认值或根本没有默认值

Python流程控制语句

PIG 自动与默认 HDFS 连接,如何?

Mongoid 按值或默认值查询

Pig 默认 JsonLoader 架构问题