Scala 从Json对象提取Json
我有以下代码:Scala 从Json对象提取Json,scala,apache-spark,spark-streaming,lift-json,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))
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秒就形成一次卡夫卡服务器。然后我使用map函数抓取消息
但是我对
foreachRDD
函数的功能有点困惑。这是否会在行数据流
中的所有RDD
上迭代(这就是我要做的)?问题是liftJSON
库中的parse函数只接受一个字符串,因此我需要迭代所有rdd,并将该字符串值传递给parse函数,这正是我试图做的但由于某些原因,没有打印任何内容。如果要从特定偏移量读取数据,则使用了错误的重载
您需要的是:
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]
您需要传递一个函数,该函数接收消息和元数据[K,V]
并返回所需的类型,例如:
val extractKeyValue: MessageAndMetadata[String, String] => (String, String) =
msgAndMeta => (msgAndMeta.key(), msgAndMeta.message())
并使用它:
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder]
(ssc, kafkaBrokers, offsetMap, extractKeyValue)
如果要从特定偏移量读取数据,则使用了错误的重载 您需要的是:
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]
您需要传递一个函数,该函数接收消息和元数据[K,V]
并返回所需的类型,例如:
val extractKeyValue: MessageAndMetadata[String, String] => (String, String) =
msgAndMeta => (msgAndMeta.key(), msgAndMeta.message())
并使用它:
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder]
(ssc, kafkaBrokers, offsetMap, extractKeyValue)
天哪,非常感谢你!只有一个问题。在这一行中:
val-extractKeyValue:MessageAndMetadata[String,String]=>(String,String)=msgAndMeta=>(msgAndMeta.key(),msgAndMeta.message())
元组中返回的是什么样的?是不是(主题名称,消息)
?@1290将记录插入卡夫卡时,请指定一个键和一个值。因此,key()
是键,message()
是值。这个方法创建了它们的Tuple2
。哦,好的,我明白了。你能回答我的另一个问题,我有关于这个流媒体工作的工作流程。因此,基本上,我的spark流式处理上下文将从我在kafkaParams
映射中指定的kafka代理流式处理数据,从0th
分区和8th
偏移量开始,如我的offsetMap
中指定的那样。所以现在我的问题是:它会每3秒运行我在注释新代码下添加到我的问题中的代码吗请参考这里?如果你想从每个分区中的特定偏移量读取,你需要在映射中为每个分区设置一个键值对,意思是映射(TopicAndPartition(“topic_test”,0)->8,TopicAndPartition(“topic_test”,1)->8)
,等等。除此之外,是的,该代码将执行您定义的每个批处理间隔。啊,好的。知道了。正如您所说,这正是我所做的,在我的映射中添加键值对以读取每个分区。如果我要求的太多,也很抱歉,但是对于createDirectStream,我们在[]
字符串、字符串、字符串解码器、字符串解码器中传递了所有这些参数,这些参数的具体用途是什么?我试着在网上搜索,但找不到一个明确的解释。我觉得我只是在复制粘贴一些代码,而不了解它真正的功能。天哪,非常感谢你!只有一个问题。在这一行中:val-extractKeyValue:MessageAndMetadata[String,String]=>(String,String)=msgAndMeta=>(msgAndMeta.key(),msgAndMeta.message())
元组中返回的是什么样的?是不是(主题名称,消息)
?@1290将记录插入卡夫卡时,请指定一个键和一个值。因此,key()
是键,message()
是值。这个方法创建了它们的Tuple2
。哦,好的,我明白了。你能回答我的另一个问题,我有关于这个流媒体工作的工作流程。因此,基本上,我的spark流式处理上下文将从我在kafkaParams
映射中指定的kafka代理流式处理数据,从0th
分区和8th
偏移量开始,如我的offsetMap
中指定的那样。所以现在我的问题是:它会每3秒运行我在注释新代码下添加到我的问题中的代码吗请参考这里?如果你想从每个分区中的特定偏移量读取,你需要在映射中为每个分区设置一个键值对,意思是映射(TopicAndPartition(“topic_test”,0)->8,TopicAndPartition(“topic_test”,1)->8)
,等等。除此之外,是的,该代码将执行您定义的每个批处理间隔。啊,好的。知道了。正如您所说,这正是我所做的,在我的映射中添加键值对以读取每个分区。如果我要求的太多,也很抱歉,但是对于createDirectStream,我们在[]
字符串、字符串、字符串解码器、字符串解码器中传递了所有这些参数,这些参数的具体用途是什么?我试着在网上搜索,但找不到一个明确的解释。我觉得我只是复制粘贴一些代码,而不了解它真正的功能。