我有一个for循环,通过遍历主题名称列表来创建kafka DStreams。然后,我想对每个RDD应用一个函数,但是我需要将主题名称传递给该函数。我看到的是该函数内部只有最后一个主题值可用(topic3)。我了解这是因为foreachRDD延迟执行了。有什么办法可以传递主题名称?我必须在不使用结构化流的情况下完成此操作。
topics = ["topic1", "topic2", "topic3"]
ssc = StreamingContext(spark_context, 5)
def process_topic(rdd, topic_value):
if not rdd.isEmpty():
print "topic : "+topic_value
df = rdd.toDF().show()
for topic in topics:
directKafkaStream = KafkaUtils.createDirectStream(ssc, [topic],{'metadata.broker.list': 'broker_url', 'auto.offset.reset': 'smallest'})
lines = directKafkaStream.map(lambda v: json.loads(v[1]))
lines.foreachRDD(lambda x: process_topic(x, topic))
ssc.start()
time.sleep(10)
ssc.stop()
输出看起来像这样:
“ topic3”
(主题1的df)
“ topic3”
(主题2为df)
“ topic3”
(主题3为df)
想看看:
“ topic1”
(主题1的df)
“ topic2”
(主题2为df)
“ topic3”
(主题3为df)