结构化流负载json转换为列输出为null

时间:2018-06-27 01:37:57

标签: json apache-spark spark-structured-streaming

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|
+----+------------+----------+

1 个答案:

答案 0 :(得分:1)

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

评论后编辑(供将来的读者使用): 键应放在引号内

修改2: 根据{{​​3}},键由字符串表示,每个字符串都应用引号引起来。 Spark使用Jackson解析器将字符串转换为对象