Scala Spark:如何将部分函数传递给数据流?

Scala Spark:如何将部分函数传递给数据流?,scala,apache-spark,scala-collections,spark-streaming,Scala,Apache Spark,Scala Collections,Spark Streaming,我试图通过滑动窗口将部分函数传递给数据流批处理中捕获的所有RDD的并集。假设我在10秒内对离散为1秒批的流构造一个窗口操作: val ssc = new StreamingContext(new SparkConf(), Seconds(1)) val stream = ssc.socketStream(...) val window = stream.window(Seconds(10)) 我的窗口将有K个RDD。我想在所有K个RDD的并集上使用collect(f:PartialFuncti

我试图通过滑动窗口将部分函数传递给数据流批处理中捕获的所有RDD的并集。假设我在10秒内对离散为1秒批的流构造一个窗口操作:

val ssc = new StreamingContext(new SparkConf(), Seconds(1))
val stream = ssc.socketStream(...)
val window = stream.window(Seconds(10))
我的
窗口将有K个RDD。我想在所有K个RDD的并集上使用
collect(f:PartialFunction[T,U])
。我可以使用
foreachRDD
调用union操作符
++
,但我希望返回
RDD
而不是
单元
,并避免副作用

我要找的是像这样的减速机

def reduce(f: (RDD[T], RDD[T]) ⇒ RDD[T]): RDD[T]
在我可以这样使用的
DStream
上:

window.reduce(_ ++ _).transform(_.collect(myPartialFunc))
但这在Spark Streaming API中不可用


有没有人有什么好主意将流中捕获的RDD组合成单个RDD,这样我就可以传入一个部分函数?还是为了实现我自己的RDD缩减器?也许这项功能将在随后的Spark版本中推出?

部分功能不受数据流操作的直接支持,但实现相同的功能并不困难

例如,让我们使用一个小的部分函数,它用字符串产生一个字符串的INT,如果它是一个数字:

val pf:PartialFunction[String,Int] = {case x if (Try(x.toInt).isSuccess) => x.toInt}
我们有一个字符串的数据流:

val stringDStream:DStream[String] = ??? // use your stream source here
然后我们可以将部分函数应用于数据流,如下所示:

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

compute函数将允许您在一段时间内获取RDD。@a该时间段从何处开始和结束?数据流方法
compute
只接受
validTime
参数。这是我的窗口的开始还是结束?另外,我将如何处理在与批处理相同的时间间隔内重复调用
compute
?我在找一些不太有状态的东西。@n为什么你不能在数据流上做
收集
。你能进一步解释一下你想做什么吗?可能还有另一种方法。@maasg正确,我正试图在一个数据集间隔内捕获的所有RDD的并集上调用
collect
。我尝试做的事情有两个步骤:(1)使用
++
操作符将一个数据流间隔内的所有RDD缩减为一个RDD,然后(2)使用数据流转换对缩减后的RDD调用
collect
。然后对
collect
的结果做什么
collect
不过是将
DStream
API上提供的
filter
map
组合在一起,但不确定为什么需要合并rdd。