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

PySpark处理Yelp签到数据:各时段签到量统计问题排查

问题解决:Yelp签到数据按小时统计次数

错误原因分析

  • 未处理date列的多日期格式:该列是逗号分隔的多个签到日期字符串,直接对整个字符串调用hour()函数无效,因为hour()仅支持时间戳类型输入。
  • 拆分日期的代码未生效:仅执行了拆分、展开操作但未将结果赋值给变量,后续仍使用原始checkin表,等于没做拆分处理。
  • 未补全无签到的小时:若部分小时没有签到记录,分组后会缺失对应行,无法保证最终结果有24行。

正确代码实现

from pyspark.sql.functions import split, explode, hour, to_timestamp

# 处理多日期拆分与格式转换
processed_checkin = checkin.select(
    "business_id",
    explode(split("date", ", ")).alias("checkin_time_str")  # 拆分逗号分隔的日期并展开为单行
).withColumn(
    "checkin_time", to_timestamp("checkin_time_str", "yyyy-MM-dd HH:mm:ss")  # 转换为时间戳类型
).withColumn(
    "hour", hour("checkin_time")  # 提取小时
)

# 统计各小时签到次数,补全0-23所有小时确保24行
# 创建包含0-23小时的临时数据集
hour_full_list = spark.createDataFrame([(h,) for h in range(24)], ["hour"])

hours_by_checkin_count = hour_full_list.join(
    processed_checkin.groupBy("hour").count(),
    on="hour",
    how="left"
).fillna({"count": 0})\
  .orderBy("count", ascending=False)\
  .select("hour", "count")  # 保证列顺序符合要求

关键说明

  1. 先拆分多日期字符串并展开,让每条签到记录单独成行,才能准确统计。
  2. 将日期字符串转为时间戳后,才能用hour()函数正确提取小时信息。
  3. 通过全量小时表左连接统计结果并填充0,确保最终数据集必有24行,满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:24:56