假设我有一个 10GB 的数据框,其中一个列的“c1”对于每条记录都具有相同的值。每个单个分区最大为 128 MB(默认值)。假设我调用repartition($"c1"),那么所有的记录会被洗牌到同一个分区吗?如果是这样,它不会超过每个分区的最大大小吗?在这种情况下,重新分区将如何工作?
问问题
65 次
2 回答
2
该配置spark.sql.files.maxPartitionBytes
仅在从基于文件的源中读取文件时有效。因此,当您执行时repartition
,您重新洗牌现有的 Dataframe,输出分区的数量将由repartition
逻辑定义,在您的情况下为 1。
于 2021-09-23T10:36:31.587 回答
1
128 MB 的值来自 spark 属性,该属性spark.sql.files.maxPartitionBytes
仅适用于在读取基于文件的源后创建数据帧时。有关详细信息,请参阅此处https://spark.apache.org/docs/latest/sql-performance-tuning.html#other-configuration-options。这是为了在阅读时实现最大并行度。因此,如果您在转换另一个数据帧或连接两个数据帧后创建一个数据帧,则分区不会影响此值。例如,您可以读取 10 GB 的数据并写入 a df.repartition(1)
,这应该可以正常工作(假设您的执行程序有足够的内存)
于 2021-09-23T10:36:02.827 回答