gpt4 book ai didi

apache-spark - 解析spark-csv数据帧读取器中的微/纳秒时间戳: Inconsistent results

转载 作者:行者123 更新时间:2023-12-02 19:49:16 25 4
gpt4 key购买 nike

我正在尝试读取一个 csv 文件,该文件的时间戳为纳秒。文件 TestTimestamp.csv 的示例内容-

spark- 2.4.0,scala - 2.11.11

   /**
* TestTimestamp.csv -
* 101,2019-SEP-23 11.42.35.456789123 AM
*
*/

尝试使用timestampFormat =“yyyy-MMM-dd hh.mm.ss.SSSSSSSSS aaa”来读取它

val dataSchema = StructType(Array(StructField("ID", DoubleType, true), StructField("Created_TS", TimestampType, true)))

val data = spark.read.format("csv")
.option("header", "false")
.option("inferSchema", "false")
.option("treatEmptyValuesAsNulls", "true")
//.option("nullValue", "")
.option("dateFormat", "yyyy-MMM-dd")
.option("timestampFormat", "yyyy-MMM-dd hh.mm.ss.SSSSSSSSS aaa")
.schema(dataSchema)
.load("C:\\TestData\\Raw\\TetraPak\\Shipments\\TestTimeStamp.csv")

data.select('Created_TS).show

我得到的输出是完全错误的日期时间。 9月23日改为9月28日

+--------------------+
| Created_TS|
+--------------------+
|2019-09-28 18:35:...|
+--------------------+

即使我有 24 小时格式的时间,例如 -“2019 年 9 月 23 日 16.42.35.456789123”我尝试通过给出 timestampFormat = "yyyy-MMM-dd HH.mm.ss.SSS"来仅使用第二个分数的前几位数字

类似的错误结果 -

val data2 = spark.read.format("csv")
.option("header", "false")
.option("inferSchema", "false")
.option("treatEmptyValuesAsNulls", "true")
//.option("nullValue", "")
.option("dateFormat", "yyyy-MMM-dd")
.option("timestampFormat", "yyyy-MMM-dd hh.mm.ss.SSS")
.schema(dataSchema)
.load("C:\\TestData\\Raw\\TetraPak\\Shipments\\TestTimeStamp.csv")

data2.select('Created_TS).show

+--------------------+
| Created_TS|
+--------------------+
|2019-09-28 23:35:...|
+--------------------+

在使用csv阅读器创建数据帧时,有什么方法可以解析此类时间戳字符串吗?

最佳答案

DataFrameReader 使用 SimpleDateFormat 来解析日期:

timestampFormat (default yyyy-MM-dd'T'HH:mm:ss.SSSXXX): sets the string that indicates a timestamp format. Custom date formats follow the formats at java.text.SimpleDateFormat. This applies to timestamp type.

不幸的是,SimpleDateFormat 不支持纳秒,因此最后一个点之后的日期部分将被解释为 456789123 毫秒,即大约 126 小时。这次已添加到您的日期中,这解释了您看到的奇怪结果。有关此主题的更多详细信息可以在 this answer 中找到。

因此,在读取 csv 后,必须在第二步中解析日期,例如使用使用 DateTimeFormatter 的 udf:

val dataSchema = StructType(Array(StructField("ID", DoubleType, true), StructField("Created_TS_String", StringType, true)))

var df = spark.read.option("header", false)
.option("inferSchema", "false")
.option("treatEmptyValuesAsNulls", "true")
.schema(dataSchema)
.csv("C:\\TestData\\Raw\\TetraPak\\Shipments\\TestTimeStamp.csv")

val toDate = udf((date: String) => {
val formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("yyyy-MMM-dd hh.mm.ss.SSSSSSSSS a").toFormatter()
Timestamp.valueOf(LocalDateTime.parse(date, formatter))
})

df = df.withColumn("Created_TS", toDate('Created_TS_String))

关于apache-spark - 解析spark-csv数据帧读取器中的微/纳秒时间戳: Inconsistent results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58557480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com