我正在使用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()
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()。
有谁能告诉我如何解决这个问题?