如何在PySpark中关联两张表并实现聚合拼接?
PySpark实现按时间段拼接结果的解决方案
当然可以实现,具体步骤如下:
1. 创建示例DataFrame
先将你提供的数据转换成PySpark可处理的DataFrame:
from pyspark.sql import SparkSession from pyspark.sql import functions as F # 初始化SparkSession spark = SparkSession.builder.appName("concat_outcome").getOrCreate() # 用户时间段表 df_users = spark.createDataFrame( [("bob", 1, 3), ("john", 5, 8)], ["name", "start", "end"] ) # 每日结果表 df_days = spark.createDataFrame( [(1, "a"), (2, "c"), (3, "d"), (4, "a"), (5, "e"), (6, "c"), (7, "u"), (8, "l")], ["day", "outcome"] )
2. 关联数据并拼接结果
通过范围关联筛选出每个用户对应时间段内的记录,再按用户分组,按日期顺序拼接结果:
# 关联两张表,筛选日期在用户时间段内的记录 result_df = df_users.join( df_days, (df_days.day >= df_users.start) & (df_days.day <= df_users.end), "left" ).groupBy("name") \ .agg(F.concat_ws("", F.collect_list("outcome").orderBy("day")).alias("combined_outcome")) # 查看结果 result_df.show(truncate=False)
3. 最终输出
运行代码后会得到你期望的结果:
+----+----------------+ |name|combined_outcome| +----+----------------+ |bob |acd | |john|ecul | +----+----------------+
关键细节:
collect_list("outcome").orderBy("day")确保收集的结果按日期顺序排列,避免拼接顺序混乱concat_ws("", ...)用于将列表中的字符串无分隔符拼接成一个整体
内容的提问来源于stack exchange,提问作者user453575457
相关产品推荐
相关产品推荐

