[英]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 )
這個網站對我沒有進一步的幫助。 我在我的格式字符串中沒有發現任何錯誤。 符號E
將day-of-week
表示為文本,如Tue; Tuesday
Tue; Tuesday
。 符號M
代表month-of-year
如7; 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.