我正在使用Spark Streaming使用Kafka主题,我需要计算数组中所有出现的值。它与规范的单词计数示例相似,不同之处在于我的输入数据是字符串列表。全面披露:我对火花一无所知。
["#epstein", "#didnt", "#kill", "#himself"]
["#foo", "#didnt", "#bar"]
需要变得像
#epstein 1
#foo 1
#didnt 2
#kill 1
#himself 1
#bar 1
到目前为止,我可以从kafka消息的其余部分中提取hashtag数组,并可以将其打印到控制台,但我不知道如何拆分/计数。
zookeeper = '10.0.8.111:2181'
kafka_topic = 'twitter_short_json'
sc = SparkContext(appName="CountHashtags")
sc.setLogLevel("ERROR")
# sets the stream to run in 5 second increments
ssc = StreamingContext(sc, 5)
kafkaStream = KafkaUtils.createStream(ssc, zookeeper, 'streaming-group', {kafka_topic: 1})
# parse the Kafka stream as json, returns a DStream object
hashtagsDStream = kafkaStream.map(lambda x: x[1]) \
.map(lambda j: json.loads(j)) \
.map(lambda p: ((p['hashtags']),))
hashtagsDStream.pprint()
如果我有RDD,可以使用如下的explode方法:
exploded = hashtagsDStream.withColumn("hashtags", explode(hashtagsDStream.hashtags))
exploded.registerTempTable('exploded_table')
sqlDF = sqlContext.sql('select count(*), hashtags from exploded_table group by hashtags order by 1 desc').show()
但是DStream没有withColumn方法,因此我只能考虑如何对数组中的实际hashtag值进行计数。
答案 0 :(得分:1)
DStream
是RDD
的流。您可以致电hashtagsDStream.foreachRDD(rdd ... )
,并在其中写下您将收到的每个rdd的内容。