PySpark数据转换:将DataFrame列唯一值合并(SQL或GroupBy实现)
PySpark 实现同组唯一值合并为逗号分隔字符串
嘿,我来帮你搞定这个PySpark的数据转换需求!你要的是把同一Name和Place分组下的Product列唯一值合并成逗号分隔的字符串,我给你准备了两种方案:DataFrame GroupBy方案和SQL方案,咱们一个个来看:
一、DataFrame GroupBy 方案
这个方案直接用DataFrame的API操作,步骤很清晰:
- 先按
Name和Place分组 - 对分组后的
Product列用collect_set()去重,得到唯一值的集合 - 再用
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
相关产品推荐
相关产品推荐

