python - 为 Pyspark 数据框按多列重新分区

标签 python apache-spark pyspark

编辑:现在我再次重读了这篇文章,为问题添加了更多上下文:

假设我有一个正在使用的 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/

相关文章:

scala - 当案例类字段是带反引号的保留 java 关键字时,spark-submit 失败

apache-spark - Kubernetes WatchConnectionManager : Exec Failure: HTTP 403

java - Spark : Going reverse in dataframe until a condition met

apache-spark - 执行pyspark.sql.DataFrame.take(4)需要1个多小时

javascript - 如何使用python获取链接内元素的文本

python - ValueError : The model is not configured to compute accuracy. 您应该传递 `metrics=["准确度“]` to the ` model.compile()` 方法

python - 嵌套列表中的列表理解

python - scapy 的最终 EXE 文件是否需要另一个依赖文件

python - 如何在 spark 中使用 transform python udf 执行 hql 脚本?

security - Spark 独立集群的身份验证