Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 从Json对象提取Json_Scala_Apache Spark_Spark Streaming_Lift Json - Fatal编程技术网

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,我们在
[]
字符串、字符串、字符串解码器、字符串解码器中传递了所有这些参数,这些参数的具体用途是什么?我试着在网上搜索,但找不到一个明确的解释。我觉得我只是复制粘贴一些代码,而不了解它真正的功能。