1. 程式人生 > >sparksql寫入hive合併小檔案

sparksql寫入hive合併小檔案

今天主要來說一下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,謝謝