如何在Spark Streaming中从DStream中删除RDD?

时间:2014-10-28 05:55:39

标签: scala apache-spark spark-streaming

我想从DStream中删除前n个RDD。我尝试使用以下函数和transform,但它不起作用(ERROR OneForOneStrategy:org.apache.spark.SparkContext java.io.NotSerializableException),我不认为它会实现我删除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())
    }
}

2 个答案:

答案 0 :(得分:1)

错误是因为您的函数引用了您的var num而且包含的类不是Serializable。您的函数将由集群的不同节点调用,因此它所依赖的任何内容都必须是Serializable,并且您不能在函数的不同调用之间共享变量(因为它们可能正在运行)在不同的集群节点上。)

想要从RDD中删除特定数量的DStream似乎很奇怪,因为特定DStream被拆分的方式几乎是一个实现细节。也许基于时间的slice方法可以做你想做的事情吗?

答案 1 :(得分:0)

您收到错误,因为我猜你从

调用此函数
  

foreachRdd

循环,它实际上是在执行者节点上执行的,如果你想在执行程序节点上执行某些代码,那些代码必须是Serializable,而SparkContext(sc,你在dropNrdds方法中引用它)是不可序列化的,因此你正在收到这个错误。

并提出你的实际问题。

不确定您的要求,但

  

您可以为RDD创建一个DataFrame并选择哪些记录   符合您的标准。并忽略其余部分。

  

您可以使用过滤器并使用过滤器数据创建新的RDD。