You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark数据转换:将DataFrame列唯一值合并(SQL或GroupBy实现)

PySpark 实现同组唯一值合并为逗号分隔字符串

嘿,我来帮你搞定这个PySpark的数据转换需求!你要的是把同一Name和Place分组下的Product列唯一值合并成逗号分隔的字符串,我给你准备了两种方案:DataFrame GroupBy方案和SQL方案,咱们一个个来看:

一、DataFrame GroupBy 方案

这个方案直接用DataFrame的API操作,步骤很清晰:

  1. 先按Name和Place分组
  2. 对分组后的Product列用collect_set()去重,得到唯一值的集合
  3. 再用concat_ws()把集合里的元素用逗号加空格连接成字符串

示例代码

from pyspark.sql import SparkSession
from pyspark.sql.functions import collect_set, concat_ws

# 初始化SparkSession
spark = SparkSession.builder.appName("ProductMerge").getOrCreate()

# 创建示例数据集
data = [
    ("AA", "Germany", "pencil"),
    ("AA", "Germany", "pen"),
    ("AA", "Germany", "pen"),
    ("BB", "Holland", "hat"),
    ("BB", "Holland", "hat"),
    ("BB", "Holland", "pen"),
    ("CC", "USA", "laptop"),
    ("CC", "USA", "laptop"),
    ("CC", "USA", "charger")
]
df1 = spark.createDataFrame(data, ["Name", "Place", "Product"])

# 执行分组合并操作
result_df = df1.groupBy("Name", "Place") \
               .agg(concat_ws(", ", collect_set("Product")).alias("Product"))

# 查看结果
result_df.show(truncate=False)

执行后你就能得到预期的输出:

+----+-------+----------------+
|Name|Place  |Product         |
+----+-------+----------------+
|AA  |Germany|pencil, pen     |
|BB  |Holland|hat, pen        |
|CC  |USA    |laptop, charger |
+----+-------+----------------+

二、SQL 方案

如果你更习惯用SQL语法来处理,也可以把DataFrame注册成临时视图,然后用SQL语句实现:

示例代码

# 把DataFrame注册为临时视图
df1.createOrReplaceTempView("product_table")

# 执行SQL查询
result_sql_df = spark.sql("""
    SELECT Name, Place, concat_ws(', ', collect_set(Product)) AS Product
    FROM product_table
    GROUP BY Name, Place
""")

# 查看结果
result_sql_df.show(truncate=False)

这个SQL查询的逻辑和DataFrame方案完全一致,只是用SQL的写法来实现,结果也是一样的。

两种方案都能完美满足你的需求,你可以根据自己的习惯来选~

内容的提问来源于stack exchange,提问作者Lilly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:02:28