编辑:现在我再次重读了这篇文章,为问题添加了更多上下文:
假设我有一个正在使用的 pyspark 数据框,目前我可以这样重新分区数据框:
dataframe.repartition(200, col_name)
然后我将该分区数据帧写入 Parquet 文件。读取目录时,看到仓库中的目录按照我想要的方式分区:
/apps/hive/warehouse/db/DATE/col_name=1
/apps/hive/warehouse/db/DATE/col_name=2
我想了解如何在多层中对其进行重新分区,这意味着我将一列划分为顶级分区,将第二列划分为二级分区,将第三列划分为第三级分区。是否像在写入方法中添加一个 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() 来写出每个分区的最大文件数吗?
最佳答案
重新分区
函数重新分区将控制数据的内存分区。如果您将重新分区指定为 200,那么在内存中您将有 200 个分区。
文件系统上的物理分区
函数 partitionBy 给定的列列表控制目录结构。将根据列名和列值创建物理分区。每个分区可以创建与重新分区中指定的文件一样多的文件(默认为 200),前提是您有足够的数据要写入。
这是基于您的问题的示例。
dataframe.
repartition(200).
write.mode("overwrite").
partitionBy("col_name1","col_name2","col_name3")
它将在每个分区中提供 200 个文件,并且将根据给定的顺序创建分区。
关于python - 为 Pyspark 数据框按多列重新分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64669293/