这个问题在这里已有答案:
我正在解决我将数据库表导入Apache Spark的问题。
我已将其转换为DataFrame。然后我执行了一个RegisterTempTable,以便我可以使用Hive查询。
我能够执行其他数学运算,比如
sqlContext.sql("select avg(Amount) from Table1001").show
但是我无法找到一个名为Amount
的字段的中位数。有没有办法在这个DataFrame上找到中位数?
请提供合适的解决方案。
您可以使用DataFrameStatFunctions.approxQuantile
来计算中位数,
val medianArray = yourDataFrame.stat.approxQuantile("Amount", Array(0.5), 0)
val median = medianArray(0)
注意::此操作针对近似解决方案进行了优化,而不是准确的解决方案。但我们想要一个准确的解决方案因此提供relativeError = 0
,这种操作可能很昂贵。
要获得中位数,如果你有percentile
(HiveContext
),你可以使用HIVE UDAF https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inAggregateFunctions(UDAF):
sqlContext.sql("select percentile(Amount, 0.5) from Table1001").show
如果性能是一个问题,您也可以使用percentile_approx