我正在创建一个粘合作业,该作业将从s3中读取信息,执行查询并输出结果。要运行的查询如下所示:
SELECT
date_trunc('hour', hourly_report.time) as hour,
sum(cost) as costs FROM table
FROM hourly_report
GROUP BY 1
我将数据加载到DynamicFrame
中,创建了DataFrame
df
,并创建了数据的临时视图。
df.createTempView("hourly_report")
然后我尝试在视图上运行查询
spark.sql("SELECT date_trunc('hour', hourly_report.time) as hour, sum(cost) as costs FROM table FROM hourly_report GROUP BY 1")
这会导致错误:
pyspark.sql.utils.AnalysisException: u"Undefined function: 'date_trunc'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 1 pos 7"
这似乎很奇怪,但是我试图通过使用udf来执行date_trunc而不是使用sql date_trunc函数来解决此问题:
import pyspark.sql.functions as sf
spark.udf.register("date_truncate", lambda x: sf.date_trunc('hour',x), TimestampType())
spark.sql("SELECT date_truncate(hourly_report.time) as hour, sum(cost) as costs FROM table FROM hourly_report GROUP BY 1")
这会导致其他错误:
AttributeError: 'module' object has no attribute 'date_trunc'
在时间戳列上执行date_trunc
操作的正确方法是什么,我做错了什么吗?