在where(filter)子句中时间戳之间的SparkSQL(MySQL中的V.S.)

时间:2018-08-21 01:46:27

标签: mysql apache-spark apache-spark-sql apache-spark-dataset

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

我的代码如下所示:

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中得到不同的结果.....我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

问题解决了!

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

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

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