繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM