首页 > 解决方案 > spark无法推断java上的时间戳

问题描述

我正在尝试从 json-file (Spark 2.4.5) 推断模式

{
"timestampField":"08.06.2020 12:03:50"
}

        StructType mySchema = spark.read()
            .option("multiline", true)
            .option("inferSchema", true)
            .option("timestampFormat","MM.dd.yyyy HH:mm:ss")
            .json("cdr_json_schema.json")
            .schema();

   root
 |-- timestampField: string (nullable = true)

我尝试使用默认格式文件并在没有 option() 的情况下读取

{
"timestampField":"2020-08-06T12:03:50.412+03:00"
}

它仍然是字符串。

标签: jsonapache-sparktimestamp

解决方案


timestampFormat将用于时间戳列。要从 json 输入中识别时间戳列,您需要指定架构如下 -


    val data =
      """
        |{
        |"timestampField":"08.06.2020 12:03:50"
        |}
      """.stripMargin
    val df = spark.read.option("multiLine", true).json(Seq(data).toDS())
    df.show(false)
    df.printSchema()
    /**
      * +-------------------+
      * |timestampField     |
      * +-------------------+
      * |08.06.2020 12:03:50|
      * +-------------------+
      *
      * root
      * |-- timestampField: string (nullable = true)
      */

    val df1 = spark.read
        .schema(StructType(StructField("timestampField", DataTypes.TimestampType) :: Nil))
      .option("multiLine", true)
      .option("timestampFormat", "MM.dd.yyyy HH:mm:ss")
      .json(Seq(data) toDS())
    df1.show(false)
    df1.printSchema()

    /**
      * +-------------------+
      * |timestampField     |
      * +-------------------+
      * |2020-08-06 12:03:50|
      * +-------------------+
      *
      * root
      * |-- timestampField: timestamp (nullable = true)
      */

推荐阅读