where(filter)子句中的timestamp之间的sparksql(mysql中的v.s.)

lhcgjxsq  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(238)

描述:
我有一个带有timestamp列的表,我想得到在特定时间窗口中时间戳所在的值的数目。
我的代码如下所示:

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

tvmytwxo

tvmytwxo1#

问题解决了!
这个问题的发生是因为时区的关系。
在spark环境中,它从unixtime获取时区,因此需要设置配置。

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

但是我仍然不明白为什么sparksql会话在系统时区中流动,而不是从列中选择。。。。。

相关问题