Scala 如何在Spark Streaming中从数据流中删除RDD?
我想从数据流中删除前n个RDD。我尝试将以下函数与transform一起使用,但不起作用(错误:OneForOneStrategy:org.apache.spark.SparkContext NotSerializableException),我认为它不会实现我删除RDD的真正目标,因为它会返回空的RDDScala 如何在Spark Streaming中从数据流中删除RDD?,scala,apache-spark,spark-streaming,Scala,Apache Spark,Spark Streaming,我想从数据流中删除前n个RDD。我尝试将以下函数与transform一起使用,但不起作用(错误:OneForOneStrategy:org.apache.spark.SparkContext NotSerializableException),我认为它不会实现我删除RDD的真正目标,因为它会返回空的RDD var num = 0 def dropNrdds(myRDD: RDD[(String, Int)], dropNum: Int) : RDD[(String, Int)] = {
var num = 0
def dropNrdds(myRDD: RDD[(String, Int)], dropNum: Int) : RDD[(String, Int)] = {
if (num < dropNum) {
num = num + 1
return myRDD
}
else {
return sc.makeRDD(Seq())
}
}
var num=0
def dropnrds(myRDD:RDD[(字符串,Int)],dropNum:Int):RDD[(字符串,Int)]={
if(num
错误是因为函数引用了var num
,并且包含的类不可序列化。您的函数将被集群的不同节点调用,因此它所依赖的任何内容都必须是可序列化的,并且您不能在函数的不同调用之间共享变量(因为它们可能在不同的集群节点上运行)
从DStream
中删除特定数量的RDD
似乎很奇怪,因为一个特定的DStream
的分割方式在很大程度上是一个实现细节。也许基于时间的slice
方法可以实现您想要的功能?您会遇到错误,因为我猜您是从
foreachRdd
循环,它实际上是在执行器节点上执行的,如果您想在执行器节点上执行某些内容,则代码必须是可序列化的,而SparkContext(sc,您在dropNrdds方法中引用它)是不可序列化的,因此您会得到该错误
来谈谈你的实际问题
不确定你的要求,但是
您可以为RDD创建数据帧,并选择
符合您的标准。忽略其余的
或
您可以使用过滤器并使用过滤器数据创建新的RDD
有没有办法将前n个窗口切掉,但仍然可以得到流的其余部分?我看了这个函数,我想我必须指定切片的结尾。我的动机是:或者是否有一种方法可以跟踪我制作的切片,并在将内容添加到输入流时继续移动它?