0

我使用的是 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中的建议使用了 percentile_approx hive UDAF .gmail.com%3E。我正在尝试将 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()

在此处输入图像描述

标量代码:

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 秒,时间随着文件大小非线性增加。

我找到了一个函数来在 计算百分位找到 RDD 的百分位 但是我不能将每一列转换为 RDD 并使用 computePercentile()。

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

4

0 回答 0