我在使用RDD.isEmpty
后使用了spark filter
。但我认为大型数据需要花费大量时间,因为isEmpty
是take(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...
}
是否有一种有效的方法来检查数据值是否为空?
答案 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())”可能是解决方案的一种方式。如果您可以提供更详细的问题,我们可以建议一种功能性方法。