如何使用for循环内的参数运行foreachRDD

时间:2019-03-23 01:41:50

标签: python apache-kafka

我有一个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)

0 个答案:

没有答案