我有一個csv檔案,我用scala和spark讀進去。在這個資料中,有一個timecolumn,它包含了形式為字串的timevalues
。val myTimestamp = "2021-05-24 18:44:22.127631600 02:00"
我現在需要決議這個時間戳。由于我有一個資料框架,我想使用.withColumn和to_timestamp的功能。
示例代碼:
import org.apache.spark.sql.SparkSession。
import org.apache.spark.sql.function.{col, to_timestamp}
val spark:SparkSession = SparkSession.builder().master("local") .getOrCreate()
val myTimestamp: String = "2021-05-24 18:44:22.127631600 02:00"
val myFormat: String = "yyy-MM-dd HH:mm:ss"
import spark.sqlContext.implicits._
Seq(myTimestamp)
.toDF("theTimestampColumn"/span>)
.withColumn("parsedTime", to_timestamp(col("theTimestampColumn"),fmt = myFormat)
.顯示()
輸出:
-------------------- -------------------
|theTimestampColumn| parsedTime|
-------------------- -------------------
|2021-05-24 18:44:... |2021-05-2418:44:22|
-------------------- -------------------
運行這段代碼可以正常作業,但是我把我的時間戳限制在一個秒的精度。我想擁有整個精度的9個零頭。因此,我閱讀了https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html下的檔案,但我無法設定正確數量的S(嘗試用1到9個S)和X來分別指定秒的分數或時區。Dataframe的parsedTime-列變成null。考慮到上面的工具,我如何決議這個時間戳呢?
例如,我也試過
val myFormat: String = "yyyy-MM-dd HH:mm:ss.SSSSSSZ"
val myFormat: String = "yyy-MM-dd HH:mm:ss.SSSSSSX"
val myFormat: String = "yyy-MM-dd HH:mm:ss.SSSSSSXXXX"
與原始時間戳或
val myTimestamp: String = "2021-05-24 18:44:22.127631600"/span>
val myFormat: String = "yyyy-MM-dd HH:mm:ss.SSSSSSS"
但轉換后得到的是一個null值。
更新:我剛剛看到,fmt是可選的。當撇開這個并呼叫to_timestamp(col("theTimestampColumn"))時,會自動將時間戳決議為6個小數。
uj5u.com熱心網友回復:
如果你的區域偏移有一個冒號,你的格式模式應該有3個X或X,這取決于你的格式是否使用Z或00:00作為零偏移。或者5個X或Z,以包括可選的秒。
來自檔案:
Offset X和x。[...] 三個字母輸出小時和分鐘,加上冒號,如' 01:30'[...] 五個字母輸出小時和分鐘,以及可選的秒,加上冒號,如' 01:30:15'[...] 模式字母'X'(大寫)將輸出'Z',而模式字母'x'(小寫)將輸出' 00',' 0000',或' 00:00'。
偏移量Z:[...]五個字母輸出小時、分鐘,如果不為零的話,還可以選擇輸出秒,并帶有冒號。如果偏移量為零,它將輸出'Z'。[...]
所以,這些東西中可能有一個應該對你有用:
val formatA = "yyyy-MM-dd HH:mm:ss.SSSSSSxxx"
val formatB = "yyy-MM-dd HH:mm:ss.SSSSSSXXX"
注意,檔案中還說
Spark支持精度為micro-of-second的資料時間,它最多有6位有效數字,但可以決議出超過部分被截斷的nano-of-second。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309127.html
標籤:
