[英]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.