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") # 保证列顺序符合要求
关键说明
- 先拆分多日期字符串并展开,让每条签到记录单独成行,才能准确统计。
- 将日期字符串转为时间戳后,才能用
hour()函数正确提取小时信息。 - 通过全量小时表左连接统计结果并填充0,确保最终数据集必有24行,满足需求。
内容的提问来源于stack exchange,提问作者future ds
相关产品推荐
相关产品推荐

