【问题标题】:repartitioning by multiple columns for Pyspark dataframe为 Pyspark 数据框按多列重新分区
【发布时间】:2021-02-16 12:16:42
【问题描述】:

编辑:在我再次重读帖子后,为问题添加更多上下文:

假设我有一个正在使用的 pyspark 数据框,目前我可以这样重新分区数据框:

dataframe.repartition(200, col_name)

然后我将分区数据帧写入镶木地板文件。读取目录的时候看到仓库中的目录按照我想要的方式分区了:

/apps/hive/warehouse/db/DATE/col_name=1
/apps/hive/warehouse/db/DATE/col_name=2

我想了解如何在多个层中对其进行重新分区,这意味着我将一列分区为顶级分区,将第二列分区为第二级分区,将第三列分区为第三级分区。是不是像在 write 方法中添加 partitionBy() 一样简单?

dataframe.mode("overwrite").partitionBy("col_name1","col_name2","col_name3")

这样创建目录?

/apps/hive/warehouse/db/DATE/col_name1=1
|--------------------------------------->/col_name2=1
|--------------------------------------------------->/col_name3=1

如果是这样,我可以使用 partitionBy() 来写出每个分区的最大文件数吗?

【问题讨论】:

  • 是的,partitionBy 将根据给定的顺序创建相关的目录结构。
  • @RamdevSharma 我可以像写 dataframe.repartition(numPartitions, Col) 一样指定每个分区可以写入的最大文件数吗?
  • 通过repartition和partitionBy,可以控制文件系统每个物理分区要写入多少文件

标签: python apache-spark pyspark


【解决方案1】:

重新分区

函数 repartition 将控制数据的内存分区。如果您将 repartition 指定为 200,那么在内存中您将有 200 个分区。

文件系统上的物理分区

函数 partitionBy 与给定的列列表控制目录结构。物理分区将根据列名和列值创建。每个分区可以创建与 repartition 中指定的文件一样多的文件(默认为 200),只要您有足够的数据可以写入。

这是基于您的问题的示例。

dataframe.
repartition(200).
write.mode("overwrite").
partitionBy("col_name1","col_name2","col_name3")

它将在每个分区中提供 200 个文件,并且将根据给定的顺序创建分区。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2016-02-23
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多