pyspark Delta Lake表存储排序

ulydmbyx  于 2022-12-03  发布在  Spark
关注(0)|答案(1)|浏览(207)

我有一个三角洲湖表,并将数据插入到该表中。业务要求排序数据,同时将其存储在表中。
在创建增量表之前,我对 Dataframe 进行了如下排序

df.sort()

然后创建增量表,如下所示

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

当将此数据检索到 Dataframe 中时,我看到数据仍然未排序。
我必须执行df.sort才能显示排序后的数据。
根据我的理解,数据实际上不能按排序顺序存储,用户在从表中提取数据时必须编写排序查询。
我需要了解这是否正确,以及三角洲湖内部如何存储数据。
我的理解是,它对数据进行分区,而不关心排序顺序。数据分布在多个分区中。
有人能更详细地澄清这一点,并建议如果我的理解是正确的吗?

kcrjzv8t

kcrjzv8t1#

Delta Lake本身不支持排序,因为这需要任何引擎写入来对数据进行排序。为了平衡简单性、接收速度和查询速度,这就是Delta Lake本身不需要或不支持排序的原因。也就是说,您的陈述是正确的。
我的理解是,它对数据进行分区,而不关心排序顺序。数据分布在多个分区中。
请注意,Delta Lake包含数据略过和OPTIMIZE ZORDER。这可让您使用数据行统计数据和丛集化数据来略过档案/数据。虽然排序对单一数据行很有帮助,但Z顺序提供更好的多数据行数据丛集。更多信息可在Delta 2.0 - The Foundation of your Data Lakehouse is Open中取得。
也就是说,Delta Lake存储数据的方式通常是写入器本身所做工作的结果。

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

然后,数据应该被排序,当读取时,它也将被排序。

相关问题