簡體   English   中英

Scala:使用 spark 3.1.2 解析時間戳

[英]Scala: Parse timestamp using spark 3.1.2

我有一個 Excel 閱讀器,我將結果放入 sparks 數據框中。 我在解析時間戳時遇到問題。

我將時間戳作為字符串,例如Wed Dec 08 10:49:59 CET 2021 我使用的是 spark-sql 版本2.4.5並且一切正常,直到我最近更新到版本3.1.2

請在下面找到一些最小的代碼。

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.{col, to_timestamp}

val ts: String = "Wed Dec 08 20:49:59 CET 2021"
val oldfmt: String = "E MMM dd HH:mm:ss z yyyy"

val ttdf = Seq(ts)
  .toDF("theTimestampColumn")
  .withColumn("parsedTime", to_timestamp(col("theTimestampColumn"), fmt = oldfmt))

ttdf.show()

使用 spark 版本2.4.5運行此代碼可以正常工作,並生成以下 output:

+--------------------+-------------------+
|  theTimestampColumn|         parsedTime|
+--------------------+-------------------+
|Wed Dec 08 20:49:...|2021-12-08 20:49:59|
+--------------------+-------------------+

現在,僅使用 spark 版本3.1.2執行相同的代碼會導致以下錯誤:

Exception in thread "main" org.apache.spark.SparkUpgradeException: 
You may get a different result due to the upgrading of Spark 3.0: 
Fail to recognize 'E MMM dd HH:mm:ss z yyyy' pattern in the DateTimeFormatter. 
1) You can set spark.sql.legacy.timeParserPolicy to LEGACY to restore the behavior before Spark 3.0. 
2) You can form a valid datetime pattern with the guide from https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html

(可點擊鏈接: https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html

這個網站對我沒有進一步的幫助。 我在我的格式字符串中沒有發現任何錯誤。 符號Eday-of-week表示為文本,如Tue; Tuesday Tue; Tuesday 符號M代表month-of-year7; 07; Jul; July 7; 07; Jul; July 7; 07; Jul; July 符號H,m,s,y分別是小時、分鍾、秒或年。 符號z表示time-zone name ,如Pacific Standard Time; PST Pacific Standard Time; PST 我在這里錯過了一些明顯的東西嗎?

任何幫助將不勝感激。 先感謝您。

日期時間模式文檔中所述,您只能將E用於日期時間格式,而不能用於解析:

'E'、'F'、'q' 和'Q' 符號只能用於日期時間格式,例如date_format。 它們不允許用於日期時間解析,例如 to_timestamp。

如果要應用 Spark 版本 <3.0 的行為,可以將spark.sql.legacy.timeParserPolicy選項設置為LEGACY

sparkSession.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")

如果您不想更改 spark 配置,可以使用substr SQL function 刪除代表天的字符:

import org.apache.spark.sql.functions.{col, to_timestamp, expr}

val ts: String = "Wed Dec 08 20:49:59 CET 2021"
val fmt: String = "MMM dd HH:mm:ss z yyyy"

val ttdf = Seq(ts)
  .toDF("theTimestampColumn")
  .withColumn("preparedTimestamp", expr("substr(theTimestampColumn, 5, length(theTimestampColumn))"))
  .withColumn("parsedTime", to_timestamp(col("preparedTimestamp"), fmt = fmt))
  .drop("preparedTimestamp")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM