我通过Impala使用R.连接到数据库。我的数据集中有一个日期列,我正在处理GMT + 3时区。当我连接到数据库时,这就是我显示数据的方式。
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver","/root/.../sqljdbc4-2.0.jar")
conn <- dbConnect(drv, "jdbc:sqlserver://port",<user>, <password>)
dbGetQuery(conn, "select eventdate from sample")
结果如下。
eventdate
1 2017-01-31
2 2017-01-31
3 2017-01-31
4 2017-01-31
5 2017-01-31
6 2017-01-31
但我的要求是通过impala连接到sqlserver,如下所示。
drv <- JDBC("com.cloudera.impala.jdbc41.Driver","/root/.../ImpalaJDBC41.jar")
impala <- src_impala(drv, "jdbc:impala://host","username", "password")
dbGetQuery(impala, "select eventdate from sample")
我得到的结果是
eventdate
1 2017-01-30 21:00:00.000000000
2 2017-01-30 21:00:00.000000000
3 2017-01-30 21:00:00.000000000
4 2017-01-30 21:00:00.000000000
5 2017-01-30 21:00:00.000000000
因此,默认情况下,它采用时区GMT并从实际数据中删除3小时。如何防止这种情况发生。
是否可以在连接时更改时区?使用tz()
提取数据和更改时间可能不适用于我的情况,因为这是一个庞大的数据集,并且提取本身需要时间。
试试lubridate包。我知道在R中使用时区的最简单方法:
library(lubridate)
with_tz(Sys.time(),"Etc/GMT+3" )
# [1] "2019-03-14 03:39:07 -03"
with_tz(Sys.time(),'UTC')
# [1] "2019-03-14 06:39:27 UTC"
您可以使用命令OlsonNames()
查看操作系统的有效时区名称。或者,您可以使用force_tz()
函数强制时区
t
[1] "2019-03-14 06:46:06 UTC"
force_tz(t,'Etc/GMT+3')
[1] "2019-03-14 06:46:06 -03"