Scala Spark:如何将部分函数传递给数据流?
我试图通过滑动窗口将部分函数传递给数据流批处理中捕获的所有RDD的并集。假设我在10秒内对离散为1秒批的流构造一个窗口操作: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
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。