根据文档,percentile命令应该给出每个数字列的确切百分比。至少当我的输入是由浮点组成的时候-这不是真的。
在hive文档中,它表示percentile命令只对整数有效。我不理解sparksql和hive之间的关系,但是spark似乎不仅仅运行hive,否则它不会改变它的文档。还有spark的 percentile
有一个不同的签名,让它得到一个 frequency
参数,我也不知道它的用途。这是一个具有意外输出的示例:
from pyspark.sql import functions as sf
d = spark.createDataFrame([[35.138071000000004], [34.119932999999996], [34.487992]], ['a'])
d.select(sf.expr('percentile(a, array(0.25,0.5,0.75,0.9,0.95)) AS res')).collect()
Out[1]: [Row(res=[34.3039625, 34.487992, 34.8130315, 35.0080552, 35.0730631])]
如果我换了 sf.expr
满足于 percentile_approx
用高精度,或用高精度 frequency
在当前的方法中,我得到了一个合理的输出。你能解释一下发生了什么事吗?
也:
你能给我解释一下sparksql和apachehive之间的关系吗?
激发sql命令运行的代码在哪里?
谢谢
1条答案
按热度按时间q7solyqu1#
spark和hive之间没有直接的关系,除了spark能够从hive metastore中检索有关hive中定义的数据库、表和视图的元数据之外。你可以通过阅读spark的在线文档来熟悉它。
sparksql是用scala编写的sql语言的一个完全独立的实现(与hive无关)。sparksql是spark使用spark集群计算平台的模块之一。与其他spark模块一起,它可以在spark自己的集群(aka standalone)上运行,也可以使用yarn或mesos。
具体来说
percentile
根据sparksql文档在sparksql中的函数。。。返回给定百分比下数值列列的精确百分位值。百分比的值必须介于0.0和1.0之间。频率值应为正积分。
编辑
频率参数已添加到
percentile
作为spark-18940的一部分,可以选择性地提供包含分析值分布的额外列(一般来说,表达式)。默认值为frequency = 1L
. 有一个后续的Spark-27929,将放宽要求有它作为类型长。