Spark DataSet 日期时间解析

Posted

技术标签:

【中文标题】Spark DataSet 日期时间解析【英文标题】:Spark DataSet date time parsing 【发布时间】:2016-10-06 12:14:38 【问题描述】:

我应该如何使用 spark 2.0 数据集 API 正确执行日期时间解析?

有很多数据框/RDD的样本

Spark date parsing Better way to convert a string field into timestamp in Spark How to change the column type from String to Date in DataFrames?

类似的类

case class MyClass(myField:java.sql.Datetime)

val mynewDf = spark.read
    .option("header", "true")
    .option("inferSchema", "true")
    .option("charset", "UTF-8")
    .option("delimiter", ",")
    .csv("pathToFile.csv")
    .as[MyClass]

不足以转换类型。 我应该如何使用数据集 API 正确执行此操作?

编辑

加载数据有效。例如。 print schema 显示 myDateFiled: timestamp (nullable = true) 但是 myDf.show 会导致

java.lang.IllegalArgumentException
        at java.sql.Date.valueOf(Date.java:143)

这让我相信我对日期的解析不正确。这怎么可能?

【问题讨论】:

对不起,我不太清楚你在这里想要达到什么目标以及你的问题是什么。您能否向我们展示输入文件的示例并详细说明您的问题? 可能应该改写:如何为数据集执行显式转换。 @cheseaux 另请参阅最新编辑中的说明 【参考方案1】:

时间戳的正确表示是java.sql.Timestamp,所以类应该定义为

case class MyClass(myField: java.sql.Timestamp)

对应的数据:

myField
"2016-01-01 00:00:03"

如果满足这些条件,您所要做的就是提供架构:

spark.read
  .options(Map("header" -> "true"))
  .schema(StructType(Seq(StructField("myField", TimestampType, false))))
  .csv(...)
  .as[MyClass]

可以使用dateFormatSimpleDateFormat string 提供替代日期格式。

架构定义可以替换为.as[MyClass]之前的类型转换:

spark.read
  .options(Map("header" -> "true"))
  .csv(...)
  .withColumn("myField", $"myField".cast("timestamp"))
  .as[MyClass]

对于DateType,请使用java.sql.Date

【讨论】:

以上是关于Spark DataSet 日期时间解析的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中处理日期

Spark Sql 映射问题

如何对dataset做一下过滤操作

Pyspark 解析自定义日期格式

将Dataset中的列类型转换为python中具有特定格式的日期时间类型时出错

使用 Apache Spark 和 Java 将 CSV 解析为 DataFrame/DataSet