如何防止SparkSQL Window函数丢弃Timestamp上的秒数?

时间:2018-05-01 14:21:24

标签: apache-spark-sql aggregate-functions

我有Spark数据框,其中第2列被命名为recorded_ts和ts。 recorded_ts是日期时间值的字符串表示(格式为20180101101125),ts是真实时间戳。

当我打印出数据帧内容时,在recorded_ts和ts之间的值之间存在一对一的匹配。

然后我使用以下

计算列的平均值
meanDF = pv \
         .groupBy("p_id", "u_id", "r_id", "b_id", window("ts", "15 minutes", "1 minute")) \
         .agg(mean("value")) \
         .withColumnRenamed("avg(value)", "mean_15")

meanDF.createOrReplaceTempView("my_stats")

upsertDF = spark.sql("select p_id, u_id, r_id, b_id, \
            date_format(window['start'], 'yyyyMMddHHmmss') as recorded_dtm, mean_15 \
           from my_stats ")


 aggRows = upsertDF.collect()
 for aggRow in aggRows:
     logger.info(aggRow)

不幸的是,recorded_dtm的值下降秒并打印为20180101101100而不是20180101101125

我尝试用900秒替换15分钟,用60秒替换1分钟,但这没有任何区别。

如何从时间戳列中保留秒数?

1 个答案:

答案 0 :(得分:0)

这是我对窗口功能的误解。 window ['start']表示窗口的开始时间。有一个对应的窗口['end']表示计算聚合的窗口的结束时间。