繁体   English   中英

使用RDD中的时间戳进行Spark

[英]Spark using timestamp inside a RDD

我正在尝试比较地图中的时间戳,但是Spark似乎使用了不同的时区或其他确实很奇怪的东西。 我阅读了如下的虚拟csv文件,以构建输入数据框:

"ts"
"1970-01-01 00:00:00"
"1970-01-01 00:00:00"
df.show(2)
+-------------------+
|        ts         |
+-------------------+
|1970-01-01 00:00:00|
|1970-01-01 00:00:00|
+-------------------+

目前,没有什么要报告的,但是:

df.rdd.map { row =>
  val timestamp = row.getTimestamp(0)
  val timestampMilli = timestamp.toInstant.toEpochMilli
  val epoch = Timestamp.from(Instant.EPOCH)
  val epochMilli = epoch.toInstant.toEpochMilli
  (timestamp, timestampMilli, epoch, epochMilli)
}.foreach(println)
(1970-01-01 00:00:00.0,-3600000,1970-01-01 01:00:00.0,0)
(1970-01-01 00:00:00.0,-3600000,1970-01-01 01:00:00.0,0)

我不明白为什么两个时间戳都不都是1970-01-01 00:00:00.0, 0 有人知道我想念什么吗?

注意:我已经使用以下属性将会话时区设置为UTC

spark.sql.session.timeZone=UTC
user.timezone=UTC

java.sql.Timestamp类从java.util.Date继承。 它们都具有存储基于UTC的数字时间戳的行为,但是会在本地时区中显示时间。 您将在Java中使用.toString()看到此结果,与在给定代码中使用println看到的结果相同。

我相信您的操作系统(或环境)设置为类似于Europe/London 请记住,在Unix时代( 1970-01-01T00:00:00Z ), 伦敦位于BST (UTC + 1)上。

您的timestampMilli变量显示为-3600000因为它将本地时间的输入解释为1970-01-01T00:00:00+01:00 ,这等效于1969-12-31T23:00:00Z

您的epoch变量显示1970-01-01 01:00:00.0因为0等于1970-01-01T00:00:00Z ,它等于1970-01-01T01:00:00+01:00

也可以看看:

我确实看到您注意到您将会话时区设置为UTC,理论上应该可以。 但是很明显,结果表明它没有使用它。 抱歉,但我对Spark不够了解,无法告诉您原因。 但是,我将专注于问题的这一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM