我们正在尝试使用Spark Streaming从Kafka获取大约80多个主题的数据 - 作为其中的一部分,我们有以下代码尝试将每个主题的数据放入其单个文件夹中。使用下面的代码,我们可以订阅Kafka的80多个主题 - 获取数据 - 创建单个文件夹 - 也可以登陆数据。我们遇到的问题是 - 没有为每个单独的主题解析数据,即从Kafka(针对88个主题)接收的整个数据块被放入每个单独的主题文件夹中。我们假设我们错过了以下代码的技巧,我们没有正确解析'foreachRDD',所以任何帮助都会受到高度赞赏。
val stream =KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaDirectParams,topicsSet )
var offsetRanges = Array.empty[OffsetRange]
stream.transform{ rdd => offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges rdd }.foreachRDD { rdd => for (o <- offsetRanges) {
loggingPlease(s"${o.topic} ${o.partition} ${o.fromOffset} ${o.untilOffset}",log4jprops)
println(s"${o.topic} ${o.partition} ${o.fromOffset} ${o.untilOffset}")
val df = rdd.toDF() val cal = Calendar.getInstance()
//val topicName = o.topic //KA_M_L_AAA_TABLE1
//val savePath = parentFolder +"/"+o.topic.split("_")(4)+"/"+o.topic.split("_")(5) +"/"+cal.get(Calendar.YEAR).toString + (cal.get(Calendar.MONTH) + 1).toString + cal.get(Calendar.DAY_OF_MONTH).toString
val savePath = parentFolder +"/"+o.topic.split("_")(3)+"_A/"+o.topic.split("_")(4) +"/DATA".toString
//val savePath = parentFolder +"/" + o.topic+ "/" df.repartition(1).write.mode(SaveMode.Append).avro(savePath) loggingPlease("RDD pulling completed",log4jprops) } }