sparksql写入hive合并小文件

版权声明:原创文章,转载请注明出处 https://blog.csdn.net/xianpanjia4616/article/details/82888608

今天主要来说一下sparksql写入hive后小文件太多,影响查询性能的问题.在另外一篇博客里面也稍微提到了一下,但还是感觉要单独说一下,首先我们要知道hive里面文件的数量=executor-cores*num-executors*job数,所以如果我们batchDuration的设置的比较小的话,每天在一个分区里面就会生成很多的小文件,我们在hive里面查询的时候就会非常的影响性能,下面介绍两种方法优化小文件:

(1),第一种,可以在创建的DataFrame的时候,cache一下,然后对DataFrame进行重新分区,可以把分区设置为1,可以用reparation,当然也可以用coalesce,这两个的区别,可以看我的另外一篇博客,这个时候就会一个job产生一个文件.但是这么做就降低了写入的性能,所以数据量不是特别大的时候,还是可以用的,但是如果数据量很大,就需谨慎使用,

(2),第二种方法是利用sql定时执行一下,insert overwrite table a select * from a;这个时候会覆盖表的数据达到合并小文件的目的,具体的sql下面会有.

下面看一下具体的代码吧:

 val df = spark.createDataFrame(rowRDD, schema).cache()
          df.coalesce(1).createOrReplaceTempView("tempTable")
          val sq = "insert into combine_data partition(day_time='" + day_time + "') select * from tempTable"
          sql(sq)
          println("插入hive成功了")
          df.unpersist(true)

insert overwrite table combine_data partition (day_time='2018-08-01') select data,enter_time from combine_data where day_time = '2018-08-01'; 

代码我就贴了重要的部分的,详细的代码在我的另外一篇博客中有,有兴趣的可以看一下.今天就写到这吧.

如果有写的不对的地方,欢迎大家指正,如果有什么疑问,可以加QQ群:340297350,谢谢

猜你喜欢

转载自blog.csdn.net/xianpanjia4616/article/details/82888608