使用Spark with Scala处理json RDD中的每个json记录

时间:2018-03-10 20:09:59

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

我需要以下方案的帮助:

我将使用以下JSON格式从Kafka获取数据以激发流式传输

<tab>

现在我想从消息中处理每个JSON记录,每个记录依次返回记录集。请给我一些想法来完成以下任务。

{"id" : 1 , "data" : "AFGH00101219"}
{"id" : 2 , "data" : "AFGH00101215"}
{"id" : 2 , "data" : "AFGH00101216"}
{"id" : 3 , "data" : "AFGH00101218"}

val messages= KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)

提前致谢。如果问题不明确,请告诉我。

1 个答案:

答案 0 :(得分:0)

你可以使用Google GSON或任何JSON解析库,我曾使用如下的Google GSON来解析我在spark streaming中收到的JSON数据。

// loop each RDD 
lines.foreachRDD(rawRDD => {
    val rdd = rawRDD.filter(!_.isEmpty)
      .map(row => {
        val jobj = new Gson().fromJson(row, classOf[JsonObject])
        val id = jobj.getAsJsonObject("id").getAsString
        val data = jobj.getAsJsonObject("data").getAsString
        // Do something with id and data
      })
  })

另一种方法是从收到的RDD

创建一个Dataframe
lines.foreachRDD(rawRDD => {
  val rdd = rawRDD.filter(!_.isEmpty)
  val df = spark.read.json(rdd)
  df.show(false)
  })

这将从rdd创建一个数据帧,如下所示,不,您可以将id和数据用于任何其他转换/操作。

+------------+---+
|data        |id |
+------------+---+
|AFGH00101219|1  |
|AFGH00101215|2  |
|AFGH00101216|2  |
|AFGH00101218|3  |
+------------+---+

我希望这有帮助!