我正在运行一个离开Kafka的火花流媒体作业。我收到的消息是这样的:
val messageStream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder, (String, Int, Long, String)](ssc, getKafkaBrokers(), getKafkaTopics("raw"), (mmd: MessageAndMetadata[String, String]) => {
(mmd.topic, mmd.partition, mmd.offset, mmd.message)
})
现在,当我带来数据时,我希望按主题和分区进行分组,以便我可以在一个批处理中处理具有相同主题/分区的所有内容。在这里使用什么是正确的功能
messageStream.foreachRDD(x => x.?
这是一个群体吗?如果它是一个groupBy如何按我所在的元组的前两个部分进行分组.KafkaRDD [0]中会有很多消息,所以我想把它们分成几组相似的消息而不是每个分组为块与单个消息。
编辑: 所以根据下面的反馈,我会有这样的事情:
messageStream.foreachRDD(x => x.groupBy(x => (x._1, x._2)).foreach(x => {
?
}))
现在是K,V就像K(主题,分区),值是(偏移,主题)? 我需要元组的第一和第二部分,因为这将允许我进行API调用以获取有关如何处理消息的说明。我不想做的是在每条消息上单独调用API,因为它们中的很多都具有基于主题/分区的相同指令集。
编辑: 意识到它现在来了:
K :(主题,分区)V:CompactBuffer((主题,分区,偏移,消息),())等。
messageStream.foreachRDD(x => x.groupBy(x => (x._1, x._2)).foreach(x => {
val topic = x._1_.1
val partition = x._1._2
x._2.forEach(x=> ...
}))
答案 0 :(得分:1)
to groupBy元组中的前两个部分,您可以尝试以下方法:
messageStream groupBy (x => (x._1, x._2))