如何有效检查RDD是空的?

时间:2017-02-21 06:44:17

标签: performance scala apache-spark

我在使用RDD.isEmpty后使用了spark filter。但我认为大型数据需要花费大量时间,因为isEmptytake(1)的操作操作。

这是示例代码。

val data = sc.parallelize(Seq(("a", 1), ("a", 2), ("b", 2), ("b", 3), ("c", 1)))
.reduceByKey(_+_)
.filter(_._2 > 5)
//Array[(String, Int)] = Array()

if(!data.isEmpty()){
    //running code...
}

是否有一种有效的方法来检查数据值是否为空?

2 个答案:

答案 0 :(得分:4)

RDD.isEmpty效率最高。它完成的工作量最少。

请记住,RDD不是数据,而是执行计划。在没有实际评估的情况下,无法检查RDD中是否存在数据,因此您必须执行操作并检查结果。

如果您需要在最终操作之前检查RDD是否为空,您可以persist首先缓存中间状态,以便在以后的工作中不需要重新评估。

答案 1 :(得分:3)

正如您已经说过的,rdd.isEmpty是一个动作,除非您重构代码以删除if条件(使用更多功能样式而不是命令式样式),否则无法消除低效率。如前所述,最简单的解决方案可能是在调用isEmpty之前使用缓存rdd,这样如果你有足够的缓存,转换将只执行一次。

由于我不知道,你想要什么作为“if(data.isEmpty())”的一部分,我能给出的唯一建议是,rdd.map,rdd.foreach等即使对于空RDD也是完全有效的。 “if(data.isEmpty())”可能是解决方案的一种方式。如果您可以提供更详细的问题,我们可以建议一种功能性方法。