为什么spark sql中的from\u unixtime返回不同的日期/时间?

fjnneemd  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(500)

有人能解释为什么from\u unixtime(0)没有返回吗 1970-01-01 00:00:00 . 例如,

Seq(1).toDF("seq").select(
    from_unixtime(lit(0)).as("timestamp_1")
).show()

退货

+-------------------+
|        timestamp_1|
+-------------------+
|1969-12-31 16:00:00|
+-------------------+

这个函数的文档似乎也有点不完整。spark 2.3.0文档 1970-01-01 00:00:00 而最新的文件说 1969-12-31 16:00:00 . 它是否取决于spark cluster的时区设置?
编辑1: spark.conf.get("spark.sql.session.timeZone") 退货 America/Los_Angeles . 所以,我现在在太平洋标准时间,太平洋标准时间是gmt-7.00。然而, from_unixtime(lit(0)) 与utc相隔8小时,而不是7小时。请注意,夏令时现在不适用。

pgvzfuti

pgvzfuti1#

这是因为时区不同- spark=2.4.5 ```
//I'm in GMT + 5:30
Seq(1).toDF("seq").select(
from_unixtime(lit(0)).as("timestamp_1")
).show()
/**
* +-------------------+
* | timestamp_1|
* +-------------------+
* |1970-01-01 05:30:00|
* +-------------------+
*/

  // Use UTC
spark.conf.set("spark.sql.session.timeZone", "UTC")
Seq(1).toDF("seq").select(
  from_unixtime(lit(0)).as("timestamp_1")
).show()
/**
  * +-------------------+
  * |        timestamp_1|
  * +-------------------+
  * |1970-01-01 00:00:00|
  * +-------------------+
  */

### 通过设置美国/洛杉矶更新-1

spark.conf.set("spark.sql.session.timeZone", "America/Los_Angeles")
Seq(1).toDF("seq").select(
from_unixtime(lit(0)).as("timestamp_1")
).show()
/**
* +-------------------+
* | timestamp_1|
* +-------------------+
* |1969-12-31 16:00:00|
* +-------------------+
*/
println(TimeZone.getTimeZone("America/Los_Angeles"))
// sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
// Please check offset which is -28800000 ms
// 28800000 ms = 8 hours

相关问题