从JSON对象中提取Lift-Json

时间:2016-07-01 20:51:11

标签: scala apache-spark spark-streaming lift-json

我的代码如下:

object Test {
    def main(args: Array[String]) {
          val sparkConf = new SparkConf().setAppName("Spark").setMaster("local[2]")
          val sc = new SparkContext(sparkConf)

          val ssc = new StreamingContext(sc, Seconds(3))
          val kafkaBrokers = Map("metadata.broker.list" -> "HostName:9092")
          val offsetMap = Map(TopicAndPartition("topic_test", 0), 8) 
          val lines = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaBrokers, offsetMap)

var offsetArray = Array[OffsetRange]()
                lines.transform {rdd =>
                        offsetArray = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
                        rdd
                }.map {
                        _.message()
                }.foreachRDD {rdd =>
                     /* NEW CODE */
                }
                ssc.start()
                ssc.awaitTermination()
    }
}

我在评论/* NEW CODE */中添加了新代码。我的问题是,行val将包含一系列RDD,它们基本上每3秒形成一次kafka服务器。然后我使用map函数抓取消息。

但我对foreachRDD函数的作用有点困惑。这是否会迭代RDD's中的所有lines DStream(我正在尝试做什么)?问题是来自lift-json库的解析函数只接受一个字符串,所以我需要迭代所有的rdd并将该String值传递给我试图做的解析函数。 但由于某种原因没有打印出来。

1 个答案:

答案 0 :(得分:1)

如果您想从特定偏移量中读取数据,则表示您使用了错误的过载。

你需要的是:

createDirectStream[K, 
                   V,
                   KD <: Decoder[K], 
                   VD <: Decoder[V], R]
                   (ssc: StreamingContext,
                    kafkaParams: Map[String, String], 
                    fromOffsets: Map[TopicAndPartition, Long], 
                    messageHandler: (MessageAndMetadata[K, V]) ⇒ R): InputDStream[R]

您需要Map[TopicAndPartition, Long]

val offsetMap = Map(TopicAndPartition("topic_test", 0), 8L) 

你需要传递一个接收MessageAndMetadata[K, V]的函数并返回你想要的类型,例如:

val extractKeyValue: MessageAndMetadata[String, String] => (String, String) = 
      msgAndMeta => (msgAndMeta.key(), msgAndMeta.message())

并使用它:

KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder]
(ssc, kafkaBrokers, offsetMap, extractKeyValue)