如何在没有hive udf的情况下计算Apache Spark中数据框中所有列的百分位数

时间:2016-05-24 09:47:33

标签: python scala apache-spark spark-dataframe hive-udf

我正在使用Spark 1.6.1独立集群和6个工作程序(每个节点8个内核和5G执行程序内存)。

我的数据框包含13列和行。我想采用每列99.5%的百分位数,我使用了https://mail-archives.apache.org/mod_mbox/spark-user/201510.mbox/%3CCALte62wQV68D6J87EVq6AD5-T3D0F3fHjuzs+1C5aCHOUUQS8w@mail.gmail.com%3E中建议的百分位数@approx hive UDAF。我试图将13列的百分位值收集到字典中。收集操作只显示1个任务,并且任务长时间处于空闲状态,之后我终止了该工作。

PYSPARK代码:

query=''
for col in mergedKpis.columns[1:]:
      query = query+"percentile_approx("+col+",array(0.005,0.995)) as " +col+","
percentile_dict = sqlContext.sql("select "+query.strip(',')+" from input_table")\
                        .rdd.map(lambda j:j.asDict()).collect()

enter image description here

SCALA CODE:

var query=""
for (col <- mergedKpis.columns.tail) {

       query=query+",percentile_approx("+col+",array(0.005))

}
sqlContext.sql("select "+query.replaceFirst(",","")+" from input_table").collect()

Scala代码也显示与python代码相同的UI。

我尝试在15MB文件中为一列运行相同的查询,花费了6秒,并且时间与文件大小呈非线性增长。

我在compute percentile找到了一个查找RDD百分位数的函数 但我无法将每列转换为RDD并使用computePercentile()。

有谁能告诉我如何解决这个问题?

0 个答案:

没有答案