我正在尝试将部分函数传递给在滑动窗口中在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版本中出现?
答案 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)