我需要用apachepig的中值来填充缺失的值。有没有有效的方法?对于r,我记得使用了以下步骤:
a <- c(1, 2, NA, 3) a[is.na(a)] <- median(a, na.rm = TRUE)
但是我需要一个使用apachepig的高效解决方案。
ffx8fchx1#
我创建了一个自定义项。结果很好。
jhiyze9q2#
我不想给出“阅读说明”的答案,但你真的需要知道pig是如何处理空值的,因为它与r有很大的不同。这是关于nulls的pig手册页:pig手册nulls也就是说,您可以使用linkedin的datafu库对已排序的订单包执行中值计算。
REGISTER datafu-1.2.0.jar DEFINE MEDIAN datafu.pig.stats.Median(); --input data: 3,5,4,1,2 input = LOAD 'input' AS (val:int); grouped = GROUP input ALL; medians = FOREACH grouped { sorted = ORDER input BY val; GENERATE MEDIAN(sorted.val); }
此时,您需要返回并用新的中间值(3,在上述情况下)替换空值。空值替换的常用方法是:
data = FOREACH data GENERATE (val IS NOT NULL ? val : 0) as result;
不幸的是,在你的情况下,这并不是真的有效,因为你是你的价值,你试图取代是不同的每个包。你可以用几种方法来处理。。。最简单的方法可能是简单地将中间值添加到包的末尾,然后执行foreach生成(val不为null?val:中脉)。
2条答案
按热度按时间ffx8fchx1#
我创建了一个自定义项。结果很好。
jhiyze9q2#
我不想给出“阅读说明”的答案,但你真的需要知道pig是如何处理空值的,因为它与r有很大的不同。
这是关于nulls的pig手册页:pig手册nulls
也就是说,您可以使用linkedin的datafu库对已排序的订单包执行中值计算。
此时,您需要返回并用新的中间值(3,在上述情况下)替换空值。
空值替换的常用方法是:
不幸的是,在你的情况下,这并不是真的有效,因为你是你的价值,你试图取代是不同的每个包。
你可以用几种方法来处理。。。最简单的方法可能是简单地将中间值添加到包的末尾,然后执行foreach生成(val不为null?val:中脉)。