sparksql寫入hive合併小檔案
阿新 • • 發佈:2018-11-10
今天主要來說一下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,謝謝