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_data
和 good_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的主要内容,如果未能解决你的问题,请参考以下文章