Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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 spark streaming加入卡夫卡主题_Scala_Apache Spark_Apache Kafka_Spark Streaming - Fatal编程技术网

Scala spark streaming加入卡夫卡主题

Scala spark streaming加入卡夫卡主题,scala,apache-spark,apache-kafka,spark-streaming,Scala,Apache Spark,Apache Kafka,Spark Streaming,我们有两个来自两个卡夫卡主题的InputDStream,但我们必须将这两个输入的数据连接在一起。 问题是,每个输入流都是独立处理的,因为foreachRDD,所以在之后不能返回任何内容到join var Message1ListBuffer = new ListBuffer[Message1] var Message2ListBuffer = new ListBuffer[Message2] inputDStream1.foreachRDD(rdd => {

我们有两个来自两个卡夫卡主题的
InputDStream
,但我们必须将这两个输入的数据连接在一起。 问题是,每个
输入流
都是独立处理的,因为
foreachRDD
,所以在
之后不能返回任何内容到
join

  var Message1ListBuffer = new ListBuffer[Message1]
  var Message2ListBuffer = new ListBuffer[Message2]

    inputDStream1.foreachRDD(rdd => {
      if (!rdd.partitions.isEmpty) {
        val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
        rdd.map({ msg =>
          val r = msg.value()
          val avro = AvroUtils.objectToAvro(r.getSchema, r)
          val messageValue = AvroInputStream.json[FMessage1](avro.getBytes("UTF-8")).singleEntity.get
          Message1ListBuffer = Message1FlatMapper.flatmap(messageValue)
          Message1ListBuffer
        })
        inputDStream1.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
      }
    })


    inputDStream2.foreachRDD(rdd => {
      if (!rdd.partitions.isEmpty) {
        val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
        rdd.map({ msg =>
          val r = msg.value()
          val avro = AvroUtils.objectToAvro(r.getSchema, r)
          val messageValue = AvroInputStream.json[FMessage2](avro.getBytes("UTF-8")).singleEntity.get
          Message2ListBuffer = Message1FlatMapper.flatmap(messageValue)
          Message2ListBuffer

        })
        inputDStream2.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
      }
    })
我想我可以返回Message1ListBuffer和Message2ListBuffer,将它们转换成数据帧并加入它们。但这是行不通的,我认为这不是最好的选择

从这里开始,返回每个foreachRDD的rdd以进行连接的方法是什么

inputDStream1.foreachRDD(rdd => {

})


inputDStream2.foreachRDD(rdd => {

})

不确定您使用的Spark版本,使用Spark 2.3+,可以直接实现

火花>=2.3时 订阅2个您想加入的主题 在两个流中格式化订阅的消息 两条溪流汇合 更多

警告:

延迟记录将不会获得加入匹配。需要稍微调整一下缓冲区


不确定您使用的Spark版本,使用Spark 2.3+,可以直接实现

火花>=2.3时 订阅2个您想加入的主题 在两个流中格式化订阅的消息 两条溪流汇合 更多

警告:

延迟记录将不会获得加入匹配。需要稍微调整一下缓冲区


什么是Spark版本?什么是Spark版本?简短明了的回答:-)简短明了的回答:-)
val ds1 = spark
  .readStream 
  .format("kafka")
  .option("kafka.bootstrap.servers", "brokerhost1:port1,brokerhost2:port2")
  .option("subscribe", "source-topic1")
  .option("startingOffsets", "earliest")
  .option("endingOffsets", "latest")
  .load

val ds2 = spark
  .readStream 
  .format("kafka")
  .option("kafka.bootstrap.servers", "brokerhost1:port1,brokerhost2:port2")
  .option("subscribe", "source-topic2")
  .option("startingOffsets", "earliest")
  .option("endingOffsets", "latest")
  .load
val stream1 = ds1.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)]

val stream2 = ds2.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)]
resultStream = stream1.join(stream2)