Delta Lake的Z-order索引數據跳轉
當您將數據寫入Delta表時,將自動收集數據跳過信息。Databricks上的Delta Lake在查詢時利用這些信息(最小值和最大值)來提供更快的查詢。您不需要配置數據跳轉;隻要適用,該功能就會被激活。然而,它的有效性取決於數據的布局。為了獲得最佳效果,請使用z值。
默認情況下,Databricks上的Delta Lake收集表模式中定義的前32列的統計信息。方法更改此值表屬性delta.dataSkippingNumIndexedCols
。添加更多列來收集統計信息會在編寫文件時增加更多的開銷。
收集長字符串的統計信息是一項開銷很大的操作。要避免收集長字符串的統計信息,您可以配置table屬性delta.dataSkippingNumIndexedCols
避免包含長字符串的列,或將包含長字符串的列移動到大於delta.dataSkippingNumIndexedCols
使用改變表格改變列
。看到ALTER TABLE
為了收集統計信息,嵌套列中的每個字段都被視為單獨的列。
什麼是z排序?
z排序是技術將相關信息放在同一組文件中。這種共局部性被Delta Lake在Databricks數據跳躍算法上自動使用。這種行為極大地減少了Delta Lake在Databricks上需要讀取的數據量。中指定要排序的列ZORDER通過
條款:
優化事件在哪裏日期> =current_timestamp()-時間間隔1一天ZORDER通過(eventType)
如果您希望一個列在查詢謂詞中經常使用,並且該列具有高基數性(即大量不同的值),則使用ZORDER通過
。
可以為。指定多個列ZORDER通過
作為逗號分隔的列表。然而,局部性的有效性隨著每增加一列而下降。在沒有收集統計信息的列上進行z排序是無效的,而且浪費資源。這是因為數據跳轉需要列本地統計信息,如min、max和count。可以通過對模式中的列重新排序來配置對某些列的統計信息收集,也可以增加要收集統計信息的列的數量。
請注意
z值是不是冪等但目標是一個漸進的操作。z軸排序所花費的時間不能保證在多次運行中減少。但是,如果沒有新數據被添加到隻是z順序的分區中,那麼該分區的另一個z順序將不會產生任何影響。
z排序旨在生成相對於元組數量均衡的數據文件,但不一定是磁盤上的數據大小。這兩個度量通常是相關的,但在某些情況下,情況並非如此,從而導致優化任務時間的傾斜。
例如,如果你
ZORDER通過
日期並且您最近的記錄都比過去的記錄寬得多(例如更長的數組或字符串值),因此預計優化
作業的任務持續時間和生成的文件大小都會發生偏差。然而,這隻是一個問題優化
命令本身;它不應該對後續查詢產生任何負麵影響。