Spark SQL小文件处理

  使用spark sql时候,小文件问题是避免不了的,当我们从hive中读取数据表时,默认就是200个分区,如果不加以处理,当我们在将数据写入到表中时,就会形成200个小文件,这样对于hdfs来说是很不友好的,会加重namenode的压力.针对于spark sql有三种方式可以对小文件的问题进行处理

  • 设置spark sql的shuffle的分区数量.
  • 使用coalesces算子
  • 使用repartition算子

未设置分区数量前从hive中读取数据,分区去量如下图
Spark SQL小文件处理_第1张图片
通过图片我们可以看到,就是默认的分区数量200.

  1. 设置sparksql shuffle参数
    val spark= SparkSession
      .builder()
      .master("[local*]")
      .enableHiveSupport()
      .config("hive.exec.dynamic.partition.mode", "true")
      .config("hive.exec.dynamic.partition.mode", "nonstrick")
      .config("spark.sql.shuffle.partitions", "1")
      .getOrCreate()
  // 配置参数中的'spark.sql.shuffle.partitions'就是设置spark sql shuffle的分区数的配置

设置shuffle分区数量后读取hive表的分区数量如下(这里我设置的分区数量是1)
在这里插入图片描述
可以看到此时数据的分区数量已经变小了,当然这里只是作为演示,设置分区数量的时候还要考虑到任务执行的并行度,一味的设置偏小的值会严重影响程序的执行速度.
2. coalesce算子

df.coalesce(1).show()

这里设置coalesce的分区数量为1
如下图:
在这里插入图片描述
3. repartition
同样repartition的分区设置方式同coalesce相同,可以直接输入分区数量,也可以通过指定字段进行分区,这里就不详细介绍了.

df.repartition(4).show

你可能感兴趣的:(SPARK,spark,sql,hive)