Scala 为什么spark中使用hiveContex的分位数计算非常慢?

Scala 为什么spark中使用hiveContex的分位数计算非常慢?,scala,apache-spark,hive,apache-spark-sql,quantile,Scala,Apache Spark,Hive,Apache Spark Sql,Quantile,我使用10 GB csv文件和色调创建了配置单元表。然后尝试运行SQL查询。在处理数据时,它的通话时间超过2小时。有人能告诉我这是否是火花问题吗??或者我做错了什么。 我尝试了所有可能的组合,比如更改执行器数量、内核和执行器内存 --driver-memory 10g\ --num-executors 10\ --executor-memory 10g\ --executor-cores 10\ 嗯,这不是火花问题。由于需要排序和相关的洗牌,在分布式环境中计算精确分位数是一个昂贵的过程。由

我使用10 GB csv文件和色调创建了配置单元表。然后尝试运行SQL查询。在处理数据时,它的通话时间超过2小时。有人能告诉我这是否是火花问题吗??或者我做错了什么。
我尝试了所有可能的组合,比如更改执行器数量、内核和执行器内存

--driver-memory 10g\ --num-executors 10\ --executor-memory 10g\ --executor-cores 10\
嗯,这不是火花问题。由于需要排序和相关的洗牌,在分布式环境中计算精确分位数是一个昂贵的过程。由于您在不同的列上计算百分位数,因此此过程会重复多次,如果变量之间没有强相关性,则成本可能会特别高。通常,除非必要,否则您应该计算精确的百分位数


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

好吧,这不是火花问题。由于需要排序和相关的洗牌,在分布式环境中计算精确分位数是一个昂贵的过程。由于您在不同的列上计算百分位数,因此此过程会重复多次,如果变量之间没有强相关性,则成本可能会特别高。通常,除非必要,否则您应该计算精确的百分位数


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

这帮助我找出了问题和解决方法。非常感谢@Zero323这帮助我找出了问题和解决方法。非常感谢@zero323 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")