pyspark groupby 使用 String groupby 键在输出中生成多行

Posted

技术标签:

【中文标题】pyspark groupby 使用 String groupby 键在输出中生成多行【英文标题】:The pyspark groupby generates multiple rows in output with String groupby key 【发布时间】:2019-11-11 22:27:22 【问题描述】:

pyspark groupby 操作不会为大型数据集生成唯一的组键

我在最终输出中看到重复的键。

 new_df = df.select('key','value') \
        .where(...) \
        .groupBy('key') \
        .count() 

例如上面的查询为 groupBy 列(键)返回多行。 groupby column('key') 的数据类型是字符串。

我将输出存储在 CSV 中

new_df.write.format("csv") \
        .option("header", "true") \
        .mode("Overwrite") \
        .save(CSV_LOCAL_PATH)

例如CSV 中的输出有重复的行

key1, 10
key2, 20
key1, 05

在 Spark 2.4.3 和 2.3 中测试 有重复。键没有区别。这发生在多个 KEYS 上。

当我计算特定键的行数时,它给出 1。

new_df.select('key','total')\
 .where((col("key") == "key1"))\
 .count()

我不确定 pyarrow 设置是否有任何不同。我之前启用过。我尝试启用和禁用 pyarrow,但结果相同。

spark.conf.set("spark.sql.execution.arrow.enabled", "true")

【问题讨论】:

预期的输出应该是单个 groupby 键.. 但这并不总是正确的。 你确定不是某种奇怪的不可打印的 unicode 将它们分开吗? 我已经验证并且没有看到任何与 unicode 字符有关的问题.. 多次分组给出相同的结果(多行重复键).. 执行以下查询仅显示一行 ``` df.select('key','count') \ 。 where((col("key") == "key1"))\ .show() ``` 你的意思是这是new_df.select(...的输出?你是如何得到你在问题中发布的输出的? 【参考方案1】:

我发现问题在于保存到忽略空格的 CSV 时。 添加以下选项有助于解决它。

 .option("ignoreLeadingWhiteSpace", "false")\
 .option("ignoreTrailingWhiteSpace", "false")

【讨论】:

以上是关于pyspark groupby 使用 String groupby 键在输出中生成多行的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 在 groupBy 之后保存数据框视图

在 pyspark 中,是不是可以使用 1 个 groupBy 进行 2 个聚合?

如何在 Pyspark 中使用 groupby 和数组元素?

Pyspark 根据数据框 groupBy 制作多个文件

Pyspark - 使用 groupby 计算中值绝对百分比误差

PySpark 计数 groupby 与 None 键