簡體   English   中英

Delta Lake 表存儲分類

[英]Delta Lake Table Storage Sorting

我有一個 delta lake 表並將數據插入到該表中。 業務要求在將數據存儲到表中時對其進行排序。

在創建增量表之前,我對 dataframe 進行了排序,如下所示

df.sort()

然后如下創建增量表

df.write.format('delta').Option('mergeSchema, true).save('deltalocation')

將此數據檢索到 dataframe 時,我看到數據仍未排序。

我必須執行df.sort才能顯示排序后的數據。

根據我的理解,數據實際上不能按排序順序存儲,用戶在從表中提取數據時必須編寫排序查詢。

我需要了解這是否正確以及三角洲湖如何在內部存儲數據。

我的理解是它對數據進行分區並且不關心排序順序。 數據分布在多個分區中。

有人可以更詳細地澄清這一點並告知我的理解是否正確嗎?

Delta Lake 本身並不支持排序,因為這需要任何引擎寫入來對數據進行排序。 為了平衡簡單性、攝取速度和查詢速度,這就是 Delta Lake 本身不需要或不啟用排序的原因。 也就是說,你的陳述是正確的。

我的理解是它對數據進行分區並且不關心排序順序。 數據分布在多個分區中。

請注意,Delta Lake 包括數據跳過和OPTIMIZE ZORDER 這允許您使用列統計信息和通過聚類數據來跳過文件/數據。 雖然排序對單列很有幫助,但 Z 順序提供了更好的多列數據集群。 Delta 2.0 中提供了更多信息 - 您的 Data Lakehouse 的基礎是開放的

話雖如此,Delta Lake 如何存儲數據往往是作者自己在做什么的產物。 如果您要在寫入階段指定一個排序,例如:

df_sorted = df.repartition("date").sortWithinPartitions("date", "id")
df_sorted.write.format("delta").partitionBy("date").save('deltalocation')

然后應該對數據進行排序,並且在讀取時也會對數據進行排序。


關於潛在訂單的問題,請允許我提供一個簡單的例子:

from pyspark.sql.functions import expr
data = spark.range(0, 100)
df = data.withColumn("mod", expr("mod(id, 10)")).show()

# Write unsorted table
df.write.format("delta").partitionBy("mod").save("/tmp/df")

# Sort within partitions
df_sorted = df.repartition("mod").sortWithinPartitions("mod", "id")

# Write sorted table
df_sorted.write.format("delta").partitionBy("mod").save("/tmp/df_sorted")

這兩個數據框已作為 Delta 表保存到它們各自的dfdf_sorted位置。

您可以通過以下方式讀取數據:

# Load data
spark.read.format("delta").load("/tmp/df").show()
spark.read.format("delta").load("/tmp/df").orderBy("mod").show()

spark.read.format("delta").load("/tmp/df_sorted").show()
spark.read.format("delta").load("/tmp/df_sorted").orderBy("mod").show()

對於未排序的查詢,這里是前 20 行,正如預期的那樣,數據未排序。

+---+---+
| id|mod|
+---+---+
| 63|  3|
| 73|  3|
| 83|  3|
| 93|  3|
|  3|  3|
| 13|  3|
| 23|  3|
| 33|  3|
| 43|  3|
| 53|  3|
| 88|  8|
| 98|  8|
| 28|  8|
| 38|  8|
| 48|  8|
| 58|  8|
|  8|  8|
| 18|  8|
| 68|  8|
| 78|  8|
+---+---+

但在df_sorted的情況下:

+---+---+
| id|mod|
+---+---+
|  2|  2|
| 12|  2|
| 22|  2|
| 32|  2|
| 42|  2|
| 52|  2|
| 62|  2|
| 72|  2|
| 82|  2|
| 92|  2|
|  9|  9|
| 19|  9|
| 29|  9|
| 39|  9|
| 49|  9|
| 59|  9|
| 69|  9|
| 79|  9|
| 89|  9|
| 99|  9|
+---+---+

如前所述,分區內的數據已排序。 分區本身沒有排序,因為不同的工作線程將按不同的分區提取數據,因此無法保證分區的順序,除非您明確指定分區的排序順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM