描述:
我有一个带有时间戳列的表,我想获取特定时间窗口中时间戳的值的数量。

我的代码如下所示:

String startTime = "2018-08-08 00:00:00";
String endTime = "2018-08-08 23:59:59";
productDF.where("CREATETIME >= '" + startTime + "' AND CREATETIME <= '" + endTime + "'").count();


我还尝试了between...and...句子;并且:

productDF.where(unix_timestamp(col("CREATETIME"), "yyyy-mm-dd hh:mm:ss")
                    .cast("timestamp")
                    .between(
                            Timestamp.valueOf(startTime),
                            Timestamp.valueOf(endTime)
                    )).count();


我得到的结果是6843。

但是当我使用Navicat操作sql语句时:

SELECT COUNT(*) FROM my_table
WHERE CREATETIME BETWEEN '2018-08-08 00:00:00' and '2018-08-08 23:59:59';


它显示7689。

问题:
我想知道为什么我在Spark和Mysql中得到不同的结果.....我在这里缺少什么?

最佳答案

问题解决了!

发生此问题是由于TIMEZONE。
在spark env。中,它从_unixtime获取时区。因此需要设置配置。

.config("spark.sql.session.timeZone", "UTC")


但是我仍然不明白为什么Spark sql会话会流到系统时区,而不仅仅是从列中选择.....

关于mysql - 在where(filter)子句中时间戳之间的SparkSQL(MySQL中的V.S.),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51940536/

10-16 21:38