我想从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())
}
}
答案 0 :(得分:1)
错误是因为您的函数引用了您的var num
而且包含的类不是Serializable
。您的函数将由集群的不同节点调用,因此它所依赖的任何内容都必须是Serializable
,并且您不能在函数的不同调用之间共享变量(因为它们可能正在运行)在不同的集群节点上。)
想要从RDD
中删除特定数量的DStream
似乎很奇怪,因为特定DStream
被拆分的方式几乎是一个实现细节。也许基于时间的slice
方法可以做你想做的事情吗?
答案 1 :(得分:0)
您收到错误,因为我猜你从
调用此函数foreachRdd
循环,它实际上是在执行者节点上执行的,如果你想在执行程序节点上执行某些代码,那些代码必须是Serializable,而SparkContext(sc,你在dropNrdds方法中引用它)是不可序列化的,因此你正在收到这个错误。
并提出你的实际问题。
不确定您的要求,但
您可以为RDD创建一个DataFrame并选择哪些记录 符合您的标准。并忽略其余部分。
或
您可以使用过滤器并使用过滤器数据创建新的RDD。