如何在Spark SQL中控制分区大小

nag*_*dra 22 hive partitioning apache-spark apache-spark-sql

我需要使用Spark SQL从Hive表加载数据HiveContext并加载到HDFS中.默认情况下,DataFramefrom SQL输出有2个分区.为了获得更多的并行性,我需要更多的SQL分区.HiveContext中没有重载方法来获取分区数参数.

RDD的重新分区导致改组并导致更多的处理时间.

>

val result = sqlContext.sql("select * from bt_st_ent")
Run Code Online (Sandbox Code Playgroud)

有日志输出:

Starting task 0.0 in stage 131.0 (TID 297, aster1.com, partition 0,NODE_LOCAL, 2203 bytes)
Starting task 1.0 in stage 131.0 (TID 298, aster1.com, partition 1,NODE_LOCAL, 2204 bytes)
Run Code Online (Sandbox Code Playgroud)

我想知道有没有办法增加SQL输出的分区大小.

use*_*411 15

Spark <2.0:

您可以使用Hadoop配置选项:

  • mapred.min.split.size.
  • mapred.max.split.size

以及HDFS块大小来控制基于文件系统的格式的分区大小*.

val minSplit: Int = ???
val maxSplit: Int = ???

sc.hadoopConfiguration.setInt("mapred.min.split.size", minSplit)
sc.hadoopConfiguration.setInt("mapred.max.split.size", maxSplit)
Run Code Online (Sandbox Code Playgroud)

Spark 2.0+:

您可以使用spark.sql.files.maxPartitionBytes配置:

spark.conf.set("spark.sql.files.maxPartitionBytes", maxSplit)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,特定数据源API可能都没有使用这些值,因此您应始终检查所使用格式的文档/实现详细信息.


*其他输入格式可以使用不同的设置.例如,参见

另外Datasets创建的RDDs将继承父母的分区布局.

类似地,分段表将使用在Metastore中定义的桶布局,桶和Dataset分区之间具有1:1的关系.


Fok*_*ong 5

一个非常常见且痛苦的问题。您应该寻找一个将数据分布在统一分区中的键。您可以使用DISTRIBUTE BYCLUSTER BY运算符告诉 Spark 将分区中的行分组。这会给查询本身带来一些开销。但会产生大小均匀的分区。Deepsense在这方面有一个非常好的教程。

  • 对于那些从谷歌登陆这里的人:Deepsense 似乎已经改变了他们的顶级域名,所以上面的链接已经过时了。帖子现在位于 https://deepsense.ai/optimize-spark-with-distribute-by-and-cluster-by/ (2认同)