寻找Spark Streaming的中位数

时间:2015-03-18 01:17:14

标签: 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.awaitTermination()

我想为流中的每个rdd生成中位数。我的流每30秒进来一次。 为了测试我的代码,我创建了一个queueStream

当我查看输出类型时,我得到以下内容:

 type(output)
<type 'NoneType'>

为什么会这样?当我尝试使用medianmap应用于我的流时,它会将中值函数一次应用于列表的每个成员。我想将中值函数应用于整个RDD作为聚合,因此map函数是不可能的。

如何在Spark Streaming中计算流的中位数?

2 个答案:

答案 0 :(得分:2)

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

median()

分别应用于每个DStream。然而结果没有被任何人使用..为什么? foreachRdd()是一个动作而不是转换。

您应该查看DStream转换:例如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 :(得分:1)

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