Pyspark directStreams foreachRdd总是有空的RDD

时间:2018-01-07 18:56:09

标签: python apache-spark pyspark rdd

我一直在尝试从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()

1 个答案:

答案 0 :(得分:2)

RDD.isEmpty是一个方法,而不是属性,因此根据language defintionrdd.isEmpty将在布尔上下文中被评估为true:

  

解释以下值   as false:“False”,“None”,所有类型的数字零,以及空   字符串和容器(包括字符串,元组,列表,   字典,集合和frozensets)。解释所有其他值   是的。

随后if not rdd.isEmpty将为假。

你应该:

if not rdd.isEmpty(): 
    ...