为什么我在基于具有 12 个不同值的列进行分区后得到更多分区

Why am I getting more Partitions after Partitioning based on a column that has 12 different values

df = spark.read.format().load(path)

df.write.mode(WriteMode.Overwrite).format().partitionBy("ColumnX").save(path)

注意:ColumnX 有 12 个不同的值

df_partitioned = spark.read.format().load(path)

print(df_partitioned.rdd.getNumPartitions())

output: 80

为什么我得到的是 80 而不是 12

当您基于默认的并行性默认读取数据/数据帧时,rdd 正在分区。如果您想确保发生分区的数量,请在 n 是您要提供的数量时使用 repartition(n)。

df.repartition(10).write.mode(WriteMode.Overwrite).format().partitionBy("ColumnX").save(路径)

在Spark中,“分区”一词是指内存分区和磁盘分区。 df_partitioned有80个内存分区和12个磁盘分区。 repartitioncoalesce 更改内存分区数,如 here. partitionBy changes the number of disk partitions as described here 所述。

内存分区和磁盘分区不同,但术语使它们听起来相同,所以您会感到困惑,这是可以理解的。

这些都会写出不同数量的文件:

// approach 1
df
  .repartition(col("ColumnX"))
  .write
  .partitionBy("ColumnX")
  .parquet(outputPath)

// approach 2
df
  .repartition(5)
  .write
  .partitionBy("ColumnX")
  .parquet(outputPath)

// approach 3
df
  .repartition(8, col("ColumnX"), rand)
  .write
  .csv(outputPath)