[英]How can I remove an RDD from a DStream in Spark Streaming?
我想从DStream中删除前n个RDD。 我尝试将以下函数与转换一起使用,但不起作用(错误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())
}
}
该错误是因为您的函数引用了您的var num
,并且包含的类不是Serializable
。 您的函数将由集群的不同节点调用,因此它所依赖的任何东西都必须是Serializable
,并且您不能在函数的不同调用之间共享变量(因为它们可能在不同的集群节点上运行)。
想要从DStream
删除特定数量的RDD
似乎很奇怪,因为拆分特定DStream
的方式DStream
是一个实现细节。 也许可以使基于时间的slice
方法做您想要做的事情?
您收到错误消息是因为,我猜您正在从以下位置调用此函数
foreachRdd
循环,该循环实际上在执行者节点上执行,并且如果您想在执行者节点上执行某些操作,则代码的价格必须是可序列化的,而SparkContext(sc,您在dropNrdds方法内部引用它)是不可序列化的,因此您得到的是错误。
并提出您的实际问题。
不确定您的要求,但
您可以为RDD创建一个DataFrame并选择符合您条件的记录。 并忽略其余部分。
要么
您可以使用过滤器并使用过滤器数据创建新的RDD。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.