如何从CSV文件中读取自定义格式的时间



我正在解析具有数据为:

的CSV文件
2016-10-03, 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").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)

我觉得这是由于时间格式错误所致。将它们转换为特定格式的方法或更改为StructType的适当含义是什么?

我期望的格式是HH:MM:SS的形式,因为它会通过Spark SQL有用,以通过串联列将其转换为时间戳格式。

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

如果将日期和时间读为字符串,则可以轻松合并并将其转换为时间戳。您不需要更改"。在时间列中,在创建时间戳时可以指定格式。Scala中的解决方案的示例:

val df = Seq(("2016-10-03", "00.00.17"),("2016-10-04", "00.01.17"))
  .toDF("Date", "Time")
val df2 = df.withColumn("DateTime", concat($"Date", lit(" "), $"Time"))
  .withColumn("Timestamp", unix_timestamp($"DateTime", "yyyy-MM-dd HH.mm.ss"))

将为您提供:

+----------+--------+-------------------+----------+
|      Date|    Time|           DateTime| Timestamp|
+----------+--------+-------------------+----------+
|2016-10-03|00.00.17|2016-10-03 00.00.17|1475424017|
|2016-10-04|00.01.17|2016-10-04 00.01.17|1475510477|
+----------+--------+-------------------+----------+

当然,如果您愿意,您仍然可以将使用":"而不是"。"转换为使用时间列。可以使用regexp_replace

来完成
df.withColumn("Time2", regexp_replace($"Time", "\.", ":"))

如果在转换为时间戳之前执行此操作,则需要更改上面的指定格式。

相关内容

  • 没有找到相关文章

最新更新