如何检查RDD是否有效?

问题描述:

我在使用filter之后使用了spark RDD.isEmpty。但我认为大数据需要花费很多时间,因为isEmptytake(1)的操作操作。如何检查RDD是否有效?

这里是示例代码。

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

为什么不使用data.count()里面如果循环? – CoDhEr

+0

我不认为这适用于大数据。 –

+0

*但我认为大数据花费很多时间*这种感觉更像是一种直觉。你有没有基准你的代码?这是实际的瓶颈吗? –

RDD.isEmpty是最高效的。它尽可能减少工作量。

请记住,RDD不是数据,它是一个执行计划。无法实际评估RDD中是否有数据是不可能的,因此您必须执行一个操作并检查结果。

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

正如您已经说过的,rdd.isEmpty是一个动作,除非您重构代码以删除if条件(使用更多功能样式而不是命令式样),否则效率无法删除。正如已经提出的那样,最简单的解决方案可能是在调用isEmpty之前使用缓存rdd,这样如果您有足够的缓存内存,转换将仅执行一次。因为我不知道,你想要什么作为“if(data.isEmpty())”的一部分,我可以给出的唯一建议是,rdd.map,rdd.foreach等是完全有效的,即使对于空RDD。 “if(data.isEmpty())”可能是解决方案的一种方法。如果您可以提供更详细的问题,我们可以建议一种功能性方法。

+0

谢谢你的回复! 我不知道如何使用'cache'? (“a”,1),(“a”,2),(“b”,2),(“b”,3),(“c”,1 ))) .reduceByKey(_ + _) .filter(_._ 2> 5).cache'你的意思是? –

+0

这正是我的意思。 – rakesh