2

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

数据框/ RDD 有很多样本,例如

像这样的一类

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 正确执行此操作?

编辑

加载数据工作。例如。aprint schema显示myDateFiled: timestamp (nullable = true) 但是 myDf.show 会导致 a

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

这让我相信我对日期的解析是不正确的。怎么会这样?

4

1 回答 1

9

时间戳的正确表示是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]

可以使用dateFormatwith SimpleDateFormatstring提供替代日期格式。

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

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

DateType使用java.sql.Date

于 2016-10-06T12:38:01.107 回答