我需要找到多个双数据类型列的中位数.请求建议找到正确的方法.
下面是我的一个列的示例数据集.我期待我的样本中值返回为1.
scala> sqlContext.sql("select num from test").show();
+---+
|num|
+---+
|0.0|
|0.0|
|1.0|
|1.0|
|1.0|
|1.0|
+---+
Run Code Online (Sandbox Code Playgroud)
我尝试了以下选项
1)Hive UDAF百分位数,它仅适用于BigInt.
2)Hive UDAT percentile_approx,但它不能按预期工作(返回0.25 vs 1).
sqlContext.sql("从test中选择percentile_approx(num,0.5)".show();
+----+
| _c0|
+----+
|0.25|
+----+
Run Code Online (Sandbox Code Playgroud)
3)Spark窗口函数percent_rank-找到中位数我看到的方法是查找高于0.5的所有percent_rank并选择max percent_rank的相应num值.但它并不适用于所有情况,特别是当我有记录计数时,在这种情况下,中位数是排序分布中的中间值的平均值.
同样在percent_rank中,因为我必须找到多列的中位数,我必须在不同的数据帧中计算它,这对我来说是一个很复杂的方法.如果我的理解不对,请纠正我.
+---+-------------+
|num|percent_rank |
+---+-------------+
|0.0|0.0|
|0.0|0.0|
|1.0|0.4|
|1.0|0.4|
|1.0|0.4|
|1.0|0.4|
+---+---+
Run Code Online (Sandbox Code Playgroud)