Python 火花流的中值搜索

Python 火花流的中值搜索,python,numpy,apache-spark,spark-streaming,Python,Numpy,Apache Spark,Spark Streaming,我正在尝试编写最简单的代码示例: from numpy import median from pyspark.streaming import StreamingContext ssc = StreamingContext(sc, 30) qs = ssc.queueStream([[1,2,3],[4,5],[6,7,8,9,9]]) output = qs.foreachRDD(median) output.pprint() ssc.start(); ssc.awaitTermina

我正在尝试编写最简单的代码示例:

from numpy import median
from pyspark.streaming import StreamingContext

ssc = StreamingContext(sc, 30)

qs = ssc.queueStream([[1,2,3],[4,5],[6,7,8,9,9]])
output = qs.foreachRDD(median)

output.pprint()

ssc.start(); ssc.awaitTermination()
我想为流中的每个rdd生成中值。我的数据流每30秒一次。 为了测试我的代码,我制作了一个队列流

当我查看输出的类型时,我得到以下结果:

 type(output)
<type 'NoneType'>
类型(输出)
为什么会这样?当我尝试使用
map
median
应用于流时,它会将median函数一次应用于列表中的每个成员。我想将中值函数作为一个聚合应用于整个RDD,因此
map
函数是不可能的


如何在Spark Streaming中计算流的中值?

原因是
foreachRDD
不返回任何内容。它只是为了执行一些动作。所以,你得到了一个空白。您可能想看看如何使用一些窗口操作。

来扩展@Justin的答案:发生了什么:

median()
正在分别应用于每个数据流。但是,没有使用结果。。任何人。。为什么?foreachRdd()是一个操作,而不是一个转换

您应该查看数据流转换:例如map():这里的代码尚未100%调试,但它提供了一个结构:

from pyspark.streaming import *
ssc = StreamingContext(sc, 30)
dataRdd = [sc.parallelize(d, 1) for d in [[1,2,3],[4,5],[6,7,8,9,9]]]
qs = ssc.queueStream(dataRdd)

def list_median((med,mylist),newval):
    mylist = [newval] if not mylist else mylist.append(newval)
    mylist = sorted(mylist)
    return (mylist[int(len(mylist)/2)], mylist)

medians = qs.reduce(list_median).map(lambda (med,list): med)
def printRec(rdd):
    import sys
    rdd.foreach(lambda rec: sys.stderr.write(repr(rec)))

medians.foreachRDD(printRec)
ssc.start(); ssc.awaitTermination()

我得到一个错误:文件“”,第1行,在列表中,中间类型错误:“int”对象不是iterable@Michal我已经更新了OP:是的,在(med,mylist)调用列表参数时,在获取正确的元组类型时存在错误。我已经更新了OP,说这有一个方法——但是函数的调用约定需要修正。