结构化流加载 json 转换为列输出为空

Structured streaming load json convert to column output is null

JsonData 就像 {reId: "1",ratingFlowId: "1001",workFlowId:"1"} 我使用的程序如下:

case class CdrData(reId: String, ratingFlowId: String, workFlowId: String)

object StructuredHdfsJson {
  def main(args: Array[String]): Unit = {
     val spark = SparkSession
      .builder()
      .appName("StructuredHdfsJson")
      .master("local")
      .getOrCreate()

     val schema = Encoders.product[CdrData].schema
     val lines =  spark.readStream
       .format("json")
       .schema(schema)
       .load("hdfs://iotsparkmaster:9000/json")
     val query = lines.writeStream
       .outputMode("update")
       .format("console")
       .start()

     query.awaitTermination()
   }
}

但是输出结果是null,如下:

------------------------------------------- 
Batch: 0 
------------------------------------------- 

+----+------------+----------+
|reId|ratingFlowId|workFlowId|
+----+------------+----------+
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
|null|        null|      null|
+----+------------+----------+

可能 Spark 无法解析您的 JSON。该问题可能与空格(或 JSON 内的任何其他字符有关。您应该尝试清理数据并再次 运行 应用程序。

评论后编辑(供以后的读者使用): 键应该放在引号中

编辑 2: 根据 json specification 键用字符串表示,每个字符串都应该用引号括起来。 Spark 使用 Jackson 解析器将字符串转换为对象