将json字符串转换为Double会在Spark Dataframe中产生空行

时间:2018-07-03 15:54:13

标签: scala apache-spark apache-spark-sql spark-streaming

这种情况困扰了我一天多。非常感谢您的帮助。

这是输入数据的样子(行中可以有更多字段)

{"Code":"MNDF","Peak":"DF","ServiceTime":"6","TransactionTime":"6","sendTimestamp":"2018-07-02T07:39:25Z"}

其架构如下

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

但是,我只对3个字段感兴趣,并将它们映射到相应的数据类型。例如。代码转换为StringType,ServiceTime转换为DoubleType,sendTimestamp转换为TimestampType

我已经定义了这样的模式

    val schema:StructType = StructType(Seq(
    StructField("Code ", StringType, true),
    StructField("ServiceTime", DoubleType, true),
    StructField("sendTimestamp", TimestampType, true)))

这是我在代码中所做的

    import session.sqlContext.implicits._  
    kafkaDF                                        
        .select(from_json($"json", schema).as("mobEvent"))

问题是,当我在架构中使用DoubleType或IntegerType时,将返回null的数据框。

Batch: 169
-------------------------------------------
+--------+
|mobEvent|
+--------+
|    null|
|    null|
|    null|

printSchema产生的位置

root
|-- mobEvent: struct (nullable = true)
|    |-- Code: string (nullable = true)
|    |-- ServiceTime: double (nullable = true)
|    |-- sendTimestamp: timestamp (nullable = true)

按如下所示在架构中使用StringType或TimesstampType时没有问题。

+------------+ 
|    mobEvent|
+------------+
|[, MNDF, ...|
|[, RSTC, ...|
|[, SCTS, ...|
|[, SCTJ, ...|

printSchema产生的位置

root
|-- mobEvent: struct (nullable = true)
|    |-- Code: string (nullable = true)
|    |-- ServiceTime: string (nullable = true)
|    |-- sendTimestamp: timestamp (nullable = true)

有什么想法吗?

0 个答案:

没有答案