gpt4 book ai didi

apache-spark-sql - df.repartition 和 DataFrameWriter partitionBy 之间的区别?

转载 作者:行者123 更新时间:2023-12-03 06:55:09 25 4
gpt4 key购买 nike

DataFrame repartition() 和 DataFrameWriter partitionBy() 方法有什么区别?

我希望两者都用于“基于数据框列分区数据”?或者说有什么区别吗?

最佳答案

注意:我相信接受的答案并不完全正确!我很高兴您提出这个问题,因为这些名称相似的函数的行为在重要且意想不到的方面有所不同,而官方 Spark 文档中并未对此进行详细记录。

接受的答案的第一部分是正确的:调用 df.repartition(COL, numPartitions=k)将创建一个带有 k 的数据框使用基于哈希的分区器进行分区。 COL这里定义了分区键——它可以是单个列或列列表。基于散列的分区器获取每个输入行的分区键,将其散列到 k 的空间中。通过类似 partition = hash(partitionKey) % k 的分区。这保证了具有相同分区键的所有行最终都位于同一分区中。但是,来自多个分区键的行也可能最终位于同一分区中(当分区键之间发生哈希冲突时),并且某些分区可能为空。

总而言之,df.repartition(COL, numPartitions=k) 的不直观方面是吗

  • 分区不会严格隔离分区键
  • 你的一些k分区可能为空,而其他分区可能包含来自多个分区键的行

df.write.partitionBy 的行为是完全不同的,以一种许多用户意想不到的方式。假设您希望输出文件按日期分区,并且数据跨度超过 7 天。我们还假设 df一开始有 10 个分区。当您运行df.write.partitionBy('day')时,您应该期望有多少个输出文件?答案是“视情况而定”。如果您的起始分区的每个分区都在df中包含每天的数据,那么答案是 70。如果每个起始分区都在 df 中恰好包含一天的数据,则答案为 10。

我们如何解释这种行为?当您运行df.write时, df 中的每个原始分区是独立写的。也就是说,您原来的 10 个分区中的每一个都在“day”列上单独进行子分区,并为每个子分区写入一个单独的文件。

我发现这种行为相当烦人,并希望有一种方法可以在编写数据帧时进行全局重新分区。

关于apache-spark-sql - df.repartition 和 DataFrameWriter partitionBy 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40416357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com