Pyspark Streaming转换错误

时间:2017-05-16 14:19:38

标签: spark-streaming

嗨,我是Pyspark Streaming的新手。

numbers0 = sc.parallelize([1,2,3,4,5])

numbers1 = sc.parallelize([2,3,4,5,6])

numbers2 = sc.parallelize([3,4,5,6,7])

stream0 = ssc.queueStream([numbers0, numbers1, numbers2])

stream0.pprint()

ssc.start()
ssc.awaitTermination(20)
ssc.stop()

这样可以正常工作,但只要我执行以下操作就会出错:

stream1 = stream0.transform(lambda x: x.mean())

stream1.pprint()

ssc.start()
ssc.awaitTermination(20)
ssc.stop()

我想要的是仅包含上一个流的平均值的流。 有谁知道我必须做什么?

1 个答案:

答案 0 :(得分:0)

调用transform时遇到的错误是因为它需要Spark's documentation for the transform operation中所述的RDD-to-RDD函数。当在RDD上调用mean时,它不会返回新的RDD,因此也不会返回错误。

现在,根据我的理解,您想要计算包含DStream的每个RDD的平均值。使用queueStream创建DStream,并且由于命名参数oneAtATime保留为默认值,因此您的程序将在每个批处理间隔使用一个RDD。

要计算每个RDD的平均值,通常会在forEachRDD输出操作中执行此操作

# Create stream0 as you do in your example

def calculate_mean(rdd):
    mean_value = rdd.mean()
    # do other stuff with mean_value like saving it to a database or just print it

stream0.forEachRDD(calculate_mean)

# Start and stop the Streaming Context