java - 如何从csv文件中读取自定义格式的时间?

标签 java csv apache-spark apache-spark-sql

我正在解析一个 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", "\\.", ":"))

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

关于java - 如何从csv文件中读取自定义格式的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46314254/

相关文章:

java - 包装器的 parseXXX() 用于签名二进制误解

java - Android 应用程序在启动时崩溃

python - 如何创建可作为python集合而不是文件使用的大数据的rdd

scala - 在 Spark 中以结构化流模式获取 Offset 的消息正在重置

java - 在 Java 中使用 Scanner 类计算 CSV 文件的平均值

java - 通用 Spring Data JPA 存储库 findAll

python - 使用 Python Pandas 跳过 csv 文件中的行

Python-网页抓取 : TypeError: string indices must be integers

ado.net - 通过 64 位的 ADO.NET 进行 CSV 访问?

apache-spark - 为什么 python UDF 返回意外的日期时间对象,而在 RDD 上应用的相同函数给出了正确的日期时间对象