Spark:如何将PartialFunction传递给DStream?

时间:2014-11-03 06:40:42

标签: scala apache-spark scala-collections spark-streaming

我正在尝试将部分函数传递给在滑动窗口中在DStream批处理中捕获的所有RDD的并集。假设我在离散为1秒批次的流上构建了一个超过10秒的窗口操作:

val ssc = new StreamingContext(new SparkConf(), Seconds(1))
val stream = ssc.socketStream(...)
val window = stream.window(Seconds(10))

我的window将有多个RDD。我想在所有这些RDD的并集上使用collect(f: PartialFunction[T, U])。我可以使用++调用union运算符foreachRDD,但我想返回RDD而不是Unit并避免副作用。

我正在寻找的是像

这样的缩减器
def reduce(f: (RDD[T], RDD[T]) ⇒ RDD[T]): RDD[T]

在我可以使用的DStream上:

window.reduce(_ ++ _).transform(_.collect(myPartialFunc))

但是Spark Streaming API中没有这个功能。

有没有人对将流中捕获的RDD组合到单个RDD中有任何好主意,所以我可以传入部分函数?或者用于实现我自己的RDD减速机?也许这个功能将在随后的Spark版本中出现?

1 个答案:

答案 0 :(得分:2)

DStream操作不直接支持部分函数,​​但实现相同的功能并不困难。

例如,让我们采用一个简单的部分函数,​​如果它是一个数字,它将获取一个String并生成一个字符串的Int:

val pf:PartialFunction[String,Int] = {case x if (Try(x.toInt).isSuccess) => x.toInt}

我们有一个字符串:

val stringDStream:DStream[String] = ??? // use your stream source here

然后我们可以将部分函数应用于DStream,如下所示:

val intDStream = stringDStream.filter(x => pf.isDefinedAt(x)).map(pf)