嗨,我是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()
我想要的是仅包含上一个流的平均值的流。 有谁知道我必须做什么?
答案 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