Delta lake 的分區表中的小文件合併

Delta Lake 作為存儲是非常好用的,之前公司是通過 spark的jdbc將數據以parquet的格式存儲到hdfs上,然後分區、合併、刪除等。

但是這個會有問題,例如 刪除的時候如果有其他任務在讀取刪除的文件會導致任務的失敗等。最主要的是 這些分區 合併、刪除、插入 都是 用spark1.6寫的,裡面的邏輯不想贅述了。

如今在微信中不經意的看到了Delta Lake,果斷被它的優點所吸引,有點像cassandra。刪除文件加入了 墓碑機制,相當於打個標籤,但是不會立刻執行刪除。但是使用 spark.read.format("delta")去讀取的時候又不會讀取到已經被打上刪除標籤的文件,非常好。

不過,在使用過程中,針對需要合併的操作,是使用 merge操作實現的,merge中又會觸發shuffle,而shuffle 的值一旦設置的大點,會導致輸出到hdfs的結果文件會很多。這個就很煩了。

後來一直在找 怎麼解決小文件的問題。

後來發現 Delta Lake 在寫入的時候有replaceWhere 這個選項。

可以在 這裡設置替換的分區,這樣可以通過


Delta lake 的分區表中的小文件合併

這樣,使用 repartition 方法再重新寫進去,就可以把 結果 合併了,不過在沒有執行 vacuum 方法之前,文件還是不會刪除的,但是執行 vacuum 後,可以看到,指定分區的文件個數已經變成了

numFiles的值了。


分享到:


相關文章: