Spark DataSet日期时间解析

时间:2016-10-06 12:14:38

标签: scala apache-spark apache-spark-dataset

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

修改

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

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

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

1 个答案:

答案 0 :(得分:6)

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

可以使用dateFormat SimpleDateFormat string来提供替代日期格式。

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

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

DateType使用java.sql.Date