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

时间:2017-09-19 08:47:14

标签: csv apache-spark apache-spark-sql

我正在解析一个数据为

的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 个答案:

答案 0 :(得分:4)

在阅读CSV文件时使用mapDefault选项,如下所示:

dateFormat

val csvs = spark. read. format("csv"). option("dateFormat", "dd-MM-yyyy"). // <-- should match 03-10-2016 load(...) 的默认设置为dateFormat,因此您发现解析错误并不奇怪。

引自valueOf的javadoc:

  

引发 yyyy-MM-dd - 如果给定的日期不是JDBC日期转义格式(yyyy- [m] m- [d] d)

这意味着IllegalArgumentException的解析器的值不正确。

我在这里有两条建议:

  1. 阅读数据集并valueOf查看数据集,了解您的内容。

  2. 使用show选项定义正确的格式(默认情况下为dateFormat

  3. 详细了解Date and Time Patternsyyyy-MM-dd)中的格式模式。