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通過日期並且您最近的記錄都比過去的記錄寬得多(例如更長的數組或字符串值),因此預計優化作業的任務持續時間和生成的文件大小都會發生偏差。然而,這隻是一個問題優化命令本身;它不應該對後續查詢產生任何負麵影響。