在 pyspark 数据框中使用 write.partitionBy 时如何删除重复项?

Posted

技术标签:

【中文标题】在 pyspark 数据框中使用 write.partitionBy 时如何删除重复项?【英文标题】:How to drop duplicates while using write.partitionBy in a pyspark dataframe? 【发布时间】:2020-10-07 21:40:40 【问题描述】:

我有一个如下所示的数据框:

|------------|-----------|---------------|---------------|
|    Name    |   Type    |  Attribute 1  |  Attribute 2  |
|------------|-----------|---------------|---------------|
|   Roger    |     A     |     X         |       Y       |
|------------|-----------|---------------|---------------|
|   Roger    |     A     |     X         |       Y       |
|------------|-----------|---------------|---------------|
|   Roger    |     A     |     X         |       Y       |
|------------|-----------|---------------|---------------|
|   Rafael   |     A     |     G         |       H       |
|------------|-----------|---------------|---------------|
|   Rafael   |     A     |     G         |       H       |
|------------|-----------|---------------|---------------|
|   Rafael   |     B     |     G         |       H       |
|------------|-----------|---------------|---------------|

我想根据名称和类型对该数据帧进行分区并保存到磁盘

这行代码目前是这样的,

df.write.partitionBy("Name", "Type").mode("append").csv("output/", header=True)

输出得到正确保存,但有重复的行,如下所述

在文件夹中

/输出/罗杰/A

|---------------|---------------|
|  Attribute 1  |  Attribute 2  |
|---------------|---------------|
|     X         |       Y       |
|---------------|---------------|
|     X         |       Y       |
|---------------|---------------|
|     X         |       Y       |
|---------------|---------------|

/输出/拉斐尔/A

|---------------|---------------|
|  Attribute 1  |  Attribute 2  |
|---------------|---------------|
|     G         |       H       |
|---------------|---------------|
|     G         |       H       |
|---------------|---------------|

/输出/拉斐尔/B

|---------------|---------------|
|  Attribute 1  |  Attribute 2  |
|---------------|---------------|
|     G         |       H       |
|---------------|---------------| 

如您所见,此 csv 包含重复项。使用 write.partitionbY 时如何删除这些重复项?

【问题讨论】:

【参考方案1】:

在写之前使用.distinct()

df.distinct().write.partitionBy("Name", "Type").mode("append").csv("output/", header=True)

【讨论】:

这会在 patitionBy 之后还是之前进行下降?在创建重复列的 write.partitionBy 时,Spark 倾向于删除 Name 和 Type 列。 它会在写入 csv 之前删除重复项。因此,您不应在输出文件中看到任何重复项。是的,Spark 不会写入 nametype 字段,因为它们已经在 partitionBy 子句中。

以上是关于在 pyspark 数据框中使用 write.partitionBy 时如何删除重复项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyspark数据框中找到没有分组的累积频率

在 pyspark 数据框中使用 write.partitionBy 时如何删除重复项?

如何从 pyspark 数据框中更快地保存 csv 文件?

PySpark-如何从此数据框中过滤行

在 python 或 Pyspark 数据框中使用特殊字符重命名列

如何从数据框中获取 1000 条记录并使用 PySpark 写入文件?