为什么在spark中使用hiveContex进行分位数计算非常慢?

时间:2016-06-24 18:13:31

标签: scala apache-spark hive apache-spark-sql quantile

我使用Hue使用10 GB csv文件创建了hive表。然后尝试运行SQL查询。处理数据时,它的谈话时间超过2小时。谁能告诉我这是否是火花问题?或者我做错了什么 我尝试了所有可能的组合,例如更改执行程序,内核和执行程序内存的数量。

 --driver-memory 10g\
 --num-executors 10\
 --executor-memory 10g\
 --executor-cores 10\

我通过更改数字执行器(如10,15,20,50,100)和内存和核心相同来测试 谈到集群,它有6个节点380+核心和1TB内存。

My SQL query:
select
percentile_approx(x1, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x1_quantiles,
percentile_approx(x2, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x2_quantiles,
percentile_approx(x3, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x3_quantiles 
from mytest.test1

代码非常简单

    val query= args(0)

    val sparkConf= new SparkConf().setAppName("Spark Hive")

    val sc = new SparkContext(sparkConf)
    val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
    sqlContext.cacheTable(" mytest.test1")
    val start = System.currentTimeMillis()

    val testload=sqlContext.sql(query)

    testload.show()
    val end = System.currentTimeMillis()
    println("Time took " + (end-start) + " ms")

1 个答案:

答案 0 :(得分:2)

嗯,这不是Spark的问题。由于需要排序和相关的混洗,计算精确分位数在分布式环境中是昂贵的过程。由于您在不同列上计算百分位数,因此此过程会重复多次,如果变量不是强相关的话,则会特别昂贵。通常,除非必要,否则应计算精确百分位数。

Spark 2.0.0实现了分位数近似的可调方法,如果您使用的是早期版本,则可以通过简单的采样获得类似的结果。见How to find median using Spark