最佳實踐:三角洲湖
本文描述了在使用三角洲湖的最佳實踐。
提供數據位置提示
如果你期望一個列中常用查詢謂詞,如果這一列具有較高的基數(即大量不同值),然後使用z值通過
。三角洲湖自動列出了文件中的數據基於列值並使用布局信息查詢時跳過不相關的數據。
有關詳細信息,請參見z值(多維聚簇)。
選擇正確的分區列
你可以分區δ表的列。最常用的分區列日期
。遵循這兩個原則的決定列到分區:
如果一個列的基數會很高,不使用列的分區。例如,如果您的分區列
用戶標識
如果可以有1米不同的用戶id,那麼這是一個糟糕的劃分策略。在每個分區的數據量:可以通過列如果你期望的數據分區,分區至少1 GB。
緊湊的文件
如果你不斷寫數據到表δ,它會隨著時間的推移積累大量的文件,特別是如果你在小批量添加數據。這可以在表讀取的效率有不利影響,它也會影響您的文件係統的性能。理想情況下,大量的小文件應該改寫成一個小數量的大文件定期。這就是所謂的壓實。
你可以緊湊的表使用優化命令。
替換一個表的內容或模式
有時你可能想要取代三角洲表。例如:
你發現表中的數據是不正確的,想替換內容。
你想要重寫整個表做不兼容的模式變化(如改變列類型)。
雖然您可以刪除整個目錄的三角洲表並創建一個新表在同一路徑,它是不推薦因為:
刪除一個目錄是無效的。一個目錄包含了非常大的文件可以刪除幾小時甚至幾天。
你失去了所有的內容被刪除的文件;很難恢複,如果你刪除錯誤的表。
目錄刪除不是原子。當你刪除表並發查詢閱讀表看失敗或部分表。
如果你不需要改變表模式,你可以刪除數據從一個δ表並插入新的數據,或更新表修複錯誤的值。
如果你想改變表模式,您可以自動替換整個表。例如:
dataframe。寫\。格式(“δ”)\。模式(“覆蓋”)\。選項(“overwriteSchema”,“真正的”)\。partitionBy(<你的- - - - - -分區- - - - - -列>)\。saveAsTable(“<表>”)#管理表dataframe。寫\。格式(“δ”)\。模式(“覆蓋”)\。選項(“overwriteSchema”,“真正的”)\。選項(“路徑”,“< your-table-path >”)\。partitionBy(<你的- - - - - -分區- - - - - -列>)\。saveAsTable(“<表>”)#外部表
取代表<你的- - - - - -表>使用δ分區通過(<你的- - - - - -分區- - - - - -列>)作為選擇…——管理表取代表<你的- - - - - -表>使用δ分區通過(<你的- - - - - -分區- - - - - -列>)位置“< your-table-path >”作為選擇…——外部表
dataframe。寫。格式(“δ”)。模式(“覆蓋”)。選項(“overwriteSchema”,“真正的”)。partitionBy(<你的- - - - - -分區- - - - - -列>)。saveAsTable(“<表>”)/ /管理表dataframe。寫。格式(“δ”)。模式(“覆蓋”)。選項(“overwriteSchema”,“真正的”)。選項(“路徑”,“< your-table-path >”)。partitionBy(<你的- - - - - -分區- - - - - -列>)。saveAsTable(“<表>”)/ /外部表
這種方法有很多好處:
覆蓋一個表要快得多,因為它不需要列出目錄遞歸地或刪除任何文件。
表的舊版本仍然存在。如果你刪除錯誤的表您可以輕鬆地檢索使用舊的數據時間旅行。
這是一個原子操作。並發查詢仍然可以讀取表當你刪除表。
因為三角洲湖酸交易擔保,如果覆蓋表失敗,表將在其之前的狀態。
另外,如果您想刪除舊文件節省存儲成本覆蓋表之後,您可以使用真空刪除它們。是優化的文件刪除,通常比刪除整個目錄。
火花緩存
磚不建議你使用火花緩存為以下原因:
你不丟失任何數據可以來自額外的過濾器添加緩存
DataFrame
。被緩存的數據可能不會更新如果訪問表使用一個不同的標識符(例如,您做的
spark.table (x) .cache ()
然後寫表使用spark.write.save(/一些/路徑)
。