Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在Spark Streaming中从数据流中删除RDD?_Scala_Apache Spark_Spark Streaming - Fatal编程技术网

Scala 如何在Spark Streaming中从数据流中删除RDD?

Scala 如何在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)] = {

我想从数据流中删除前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)] = {
    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个窗口切掉,但仍然可以得到流的其余部分?我看了这个函数,我想我必须指定切片的结尾。我的动机是:或者是否有一种方法可以跟踪我制作的切片,并在将内容添加到输入流时继续移动它?