如何从CSV文件中以自定义格式读取日期?

3

我正在解析一个包含数据的csv文件

03-10-2016,18:00:00,2,6

当我阅读以下文件创建模式时:
StructType schema = DataTypes.createStructType(Arrays.asList(
                DataTypes.createStructField("Date", DataTypes.DateType, false),
                DataTypes.createStructField("Time", DataTypes.TimestampType, false),
                DataTypes.createStructField("CO(GT)", DataTypes.IntegerType, false),
                DataTypes.createStructField("PT08.S1(CO)", DataTypes.IntegerType, false)))
Dataset<Row> df = spark.read().format("csv").option("Date", "dd-MM-yyyy").schema(schema).load("src/main/resources/AirQualityUCI/sample.csv");

它产生了以下错误:

Exception in task 0.0 in stage 0.0 (TID 0)
java.lang.IllegalArgumentException
    at java.sql.Date.valueOf(Unknown Source)
    at org.apache.spark.sql.catalyst.util.DateTimeUtils$.stringToTime(DateTimeUtils.scala:137)

我认为这是由于日期格式错误导致的。有哪些方法可以将它们转换为特定的格式?

1个回答

7

在读取CSV文件时,使用dateFormat选项如下:

val csvs = spark.
  read.
  format("csv").
  option("dateFormat", "dd-MM-yyyy"). // <-- should match 03-10-2016
  load(...)
dateFormat 的默认值为 yyyy-MM-dd,所以你遇到解析错误并不意外。
引用自 valueOf 的 javadoc:

Throws IllegalArgumentException - 如果提供的日期不符合 JDBC 日期转义格式 (yyyy-[m]m-[d]d)

这意味着对于 valueOf 的解析器,该值是不正确的。
我有两个建议:
  1. 阅读数据集并使用 show 函数查看其中的内容。

  2. 使用 dateFormat 选项定义适当的格式(默认为 yyyy-MM-dd

日期和时间模式 中可以找到更多关于格式模式的信息(属于 java.text.SimpleDateFormat)。

我可以在这里使用map函数吗?它可以在解析CSV数据时使用dataFormat对字符串进行格式转换,然后创建所需的数据集。只是好奇。 - Utkarsh Saraf
1
你可以这样做,但最好不要去做那些Spark本来就能为你完成的事情(除非你确信自己能做得更好)。 - Jacek Laskowski
1
当然。我是你的忠实粉丝,已经阅读了你的名为“掌握Spark”的精彩笔记。它们对学习Spark非常有帮助 :) - Utkarsh Saraf
有没有关于如何使用 option 的详细说明或链接? - Utkarsh Saraf
正在处理一个项目,目前还没有发现值得一提的东西。 - Jacek Laskowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接