我一直在尝试从Kafka主题中读取我的数据并将其写入镶木地板文件。到目前为止,我有一切工作,除了foreachRdd函数。我在dstream上使用地图时可以看到数据,但是使用foreachRdd的下一步,Rdd总是空的,我不知道为什么。
我的环境是Ubuntu同时运行Kafka和Spark。我正在使用pyspark shell。我是python的新手,所以有很多我仍然磕磕绊绊的语法,我不确定这是不是我的问题所在。
非常感谢任何帮助或见解。
这是我在pyspark shell中粘贴的代码的副本
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
from pyspark.sql.types import *
import json
kafkaBroker = 'localhost:9092'
consumer_group = 'spark-streaming'
topic = 'test'
batchTimeDur=5
ssc = StreamingContext(sc, batchTimeDur)
directKafkaStream = KafkaUtils.createDirectStream(ssc, [topic], {"metadata.broker.list": kafkaBroker})
#change string to json string
lines = directKafkaStream.map(lambda v: json.loads(v[1]))
# show what is in the stream
lines.map(lambda x: 'rec in this line: %s\n' % x).pprint()
# save lines to file
lines.foreachRDD(lambda x: saveAsParquet(x))
def saveAsParquet(rdd):
print('in save a parquet')
if not rdd.isEmpty:
df = sqlContext.createDataFrame(rdd, buildSchema())
#df.write.parquet('file:///vagrant/streamed-parquet', mode='overwrite')
print(' writing file')
df.write.parquet('file:///vagrant/streamed-parquet', mode='append')
print('return save as parquet')
return rdd
ssc.start()
答案 0 :(得分:2)
RDD.isEmpty
是一个方法,而不是属性,因此根据language defintion,rdd.isEmpty
将在布尔上下文中被评估为true:
解释以下值 as false:“False”,“None”,所有类型的数字零,以及空 字符串和容器(包括字符串,元组,列表, 字典,集合和frozensets)。解释所有其他值 是的。
随后if not rdd.isEmpty
将为假。
你应该:
if not rdd.isEmpty():
...