簡體   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