Spark使用date_trunc截断timestamp至小时报错求助
问题分析与解决
数据表
| job_id | timestamp | avg_Tag_value |
|---|---|---|
| j1 | 2023-03-19T01:52:00.000+0000 | 0.4 |
| j2 | 2023-03-19T01:53:00.000+0000 | 0.5 |
| j3 | 2023-03-19T01:54:00.000+0000 | 0.6 |
报错信息
AnalysisException: cannot resolve '
timestamp' given input columns: [date_trunc(hour, timestamp)];
原因
执行df = df.select(date_trunc("hour", "timestamp"))后,新生成的DataFrame只保留了date_trunc(hour, timestamp)这一列,原timestamp列被丢弃。如果后续代码仍尝试引用timestamp列,就会触发“无法解析该列”的报错。
解决方案
- 保留原列并新增截断列(推荐)
如果需要保留所有原始列,同时添加小时级截断后的时间列,使用withColumn:
from pyspark.sql.functions import date_trunc df = df.withColumn("hour_truncated", date_trunc("hour", "timestamp"))
执行后,DataFrame会保留job_id、timestamp、avg_Tag_value,同时新增hour_truncated列。
- 仅保留截断列(需指定别名)
如果确实只需要截断后的时间列,给计算结果起别名,避免后续操作混淆:
from pyspark.sql.functions import date_trunc df = df.select(date_trunc("hour", "timestamp").alias("hour_truncated"))
此时DataFrame仅包含hour_truncated列,后续操作使用该列名即可。
内容的提问来源于stack exchange,提问作者MMV
相关产品推荐
相关产品推荐

