簡體   English   中英

在火花流中解析 json

[英]Parsing json in spark-streaming

我對 spark 很陌生,我正在嘗試從 kafka 主題接收結構為 json 的 DStream,我想解析每個 json 的內容。 我收到的 json 是這樣的:

{"type":"position","ident":"IBE32JZ","air_ground":"A","alt":"34000","clock":"1409733420","id":"IBE32JZ-1409715361-ed-0002:0","gs":"446","heading":"71","lat":"44.50987","lon":"2.98972","reg":"ECJRE","squawk":"1004","updateType":"A","altChange":" "}

我正在嘗試僅提取 ident 字段,至少現在是這樣,並且我正在使用 lift-json 庫來解析數據。 我的程序如下所示:

object ScalaExample {
    val kafkaHost = "localhost"
    val kafkaPort = 9092
    val zookeeperHost = "localhost"
    val zookeeperPort = 2181

    implicit val formats = DefaultFormats
    case class PlaneInfo(ident: String)


    def parser(json: String): String = {
        val parsedJson = parse(json)
        val m = paso1.extract[PlaneInfo]
        return m.ident
    }

    def main(args : Array[String]) {
        val zkQuorum = "localhost:2181"
        val group = "myGroup"
        val topic = Map("flightStatus" -> 1)
        val sparkContext = new SparkContext("local[4]", "KafkaConsumer")
        val ssc = new StreamingContext(sparkContext, Seconds(10))


        val json = KafkaUtils.createStream(ssc, zkQuorum, group, topic)

        val id = json.map(_._2).map(parser)

        id.print

        ssc.start()
 }
}

但它向我拋出了以下異常:

java.lang.NoClassDefFoundError: scala/reflect/ClassManifest
    at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:300)
    at aero.catec.stratio.ScalaExample$.parser(ScalaExample.scala:33)
    at aero.catec.stratio.ScalaExample$$anonfun$2.apply(ScalaExample.scala:48)
    at aero.catec.stratio.ScalaExample$$anonfun$2.apply(ScalaExample.scala:48)
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328)
    at scala.collection.Iterator$$anon$10.next(Iterator.scala:312)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
    at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48)
    at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:103)
    at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:47)
    at scala.collection.TraversableOnce$class.to(TraversableOnce.scala:273)
    at scala.collection.AbstractIterator.to(Iterator.scala:1157)
    at scala.collection.TraversableOnce$class.toBuffer(TraversableOnce.scala:265)
    at scala.collection.AbstractIterator.toBuffer(Iterator.scala:1157)
    at scala.collection.TraversableOnce$class.toArray(TraversableOnce.scala:252)
    at scala.collection.AbstractIterator.toArray(Iterator.scala:1157)
    at org.apache.spark.rdd.RDD$$anonfun$28.apply(RDD.scala:1003)
    at org.apache.spark.rdd.RDD$$anonfun$28.apply(RDD.scala:1003)
    at org.apache.spark.SparkContext$$anonfun$runJob$4.apply(SparkContext.scala:1083)
    at org.apache.spark.SparkContext$$anonfun$runJob$4.apply(SparkContext.scala:1083)
    at org.apache.spark.scheduler.DAGScheduler.runLocallyWithinThread(DAGScheduler.scala:575)
    at org.apache.spark.scheduler.DAGScheduler$$anon$1.run(DAGScheduler.scala:560)
Caused by: java.lang.ClassNotFoundException: scala.reflect.ClassManifest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

問題是,如果在不使用 spark(從文件中讀取)的情況下運行相同的程序,它會完美運行。 當我嘗試將其放入火花程序時,問題就開始了。 另外,如果我將解析器函數更改為如下所示:

def parser(json: String): JValue = {
  val parsedJson = parse(json)
  return (parsedJson \\ "ident")
}

它也有效。 但是當我嘗試提取實際的字符串時,我得到了同樣的錯誤。

謝謝您的幫助。 我希望我已經解釋得很好。

發生這種情況是因為您缺少序列化/反序列化記錄所需的 scala 反映依賴關系。 嘗試添加與 spark 版本匹配的 scala reflect jar。

提示: "org.scala-lang" % "scala-reflect" % Version.scala

哦,一個很好的老問題:-)

基本上這表明存在版本問題:您的依賴項之一與您當前使用的 Scala 編譯器不兼容。 你是2.10嗎?

嘗試用谷歌搜索“NoClassDefFoundError: scala/reflect/ClassManifest”這個短語,我相信你會找到關於這個問題的足夠多的描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM