用SparkSQL和PySpark完成按时间字段顺序将字符串字段中的值组合在一起分组显示

用SparkSQL和PySpark完成以下数据转换。

源数据:

userid,page_name,visit_time

1,A,2021-2-1

2,B,2024-1-1

1,C,2020-5-4

2,D,2028-9-1

目的数据:

user_id,page_name_path

1,C->A

2,B->D

PySpark:

python 复制代码
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.window import Window

# 初始化SparkSession(如果在已有环境中可以直接使用已有的spark对象)
spark = SparkSession.builder.appName("DataTransformation").getOrCreate()

# 创建示例数据的DataFrame
data = [
    (1, "A", "2021-2-1"),
    (2, "B", "2024-1-1"),
    (1, "C", "2020-5-4"),
    (2, "D", "2028-9-1")
]
columns = ["userid", "page_name", "visit_time"]
df = spark.createDataFrame(data, columns)

# 将visit_time转换为日期类型,方便后续排序
df = df.withColumn("visit_time", F.to_date(F.col("visit_time")))

# 按照userid分区,根据visit_time排序创建窗口
window_spec = Window.partitionBy("userid").orderBy("visit_time")

# 使用collect_list函数收集每个userid对应的page_name列表,然后使用concat_ws函数将其拼接为指定格式
result_df = df.withColumn("page_name_list", F.collect_list("page_name").over(window_spec)) \
             .groupBy("userid") \
             .agg(F.concat_ws("->", F.col("page_name_list")).alias("page_name_path")) \
             .select("userid", "page_name_path")

# 重命名userid列为user_id(和目标数据列名一致)
result_df = result_df.withColumnRenamed("userid", "user_id")

# 展示结果
result_df.show()

SparkSQL:

sql 复制代码
SELECT userid AS user_id,
       CONCAT_WS('->', collect_list(page_name) OVER (PARTITION BY userid ORDER BY visit_time)) AS page_name_path
FROM page_visits
GROUP BY userid
相关推荐
我的世界洛天依几秒前
洛天依讲编程:调音教学|调性 ——MIDI 里的「钩子函数」
linux·前端·javascript
Cobyte13 分钟前
7.响应式系统比对:手写一个响应式状态库并应用在 React 上
前端·javascript·vue.js
渔舟小调14 分钟前
P18 | Element Plus 通用 CRUD 页面模板:一个模板覆盖 80% 管理页面
javascript·vue.js·elementui
1314lay_100735 分钟前
匿名插槽和具名插槽的使用
前端·javascript·vue.js
Highcharts.js1 小时前
步骤总结|使用 React + Highcharts 实现动态更新图表
前端·javascript·react.js·前端框架·highcharts·图表渲染
好家伙VCC1 小时前
# React发散创新:从状态管理到自定义Hook的极致实践与性能优化在现代前端开发
java·javascript·python·react.js·性能优化
刀法如飞1 小时前
一款基于 NestJS 的 DDD 脚手架,开箱即用
javascript·后端·架构
Liu.7741 小时前
Vue 3开发中遇到的报错(1)
前端·javascript·vue.js
幺风12 小时前
Claude Code 源码分析 — Tool/MCP/Skill 可扩展工具系统
前端·javascript·ai编程
ID_1800790547313 小时前
淘宝 API 上货 / 商品搬家 业务场景实现 + JSON 返回示例
前端·javascript·json