有人可以解释RDD countApprox()与count()之间的区别,如果可能的话,可以回答哪个是最快的?我们有一个非常有帮助的地方 count()非常慢需要大约30分钟... ...尝试countApprox()它是第一次运行快**(**关于1.2分钟)然后放慢到 30分钟 .....
这就是我们使用它的方式,不确定它是否是最好的使用方式
rdd.countApprox(timeout=800, confidence=0.5)
答案 0 :(得分:4)
countApprox(timeout: Long, confidence: Double)
默认值:置信度= 0.95
注意:根据spark源代码,对countApprox的支持标记为“Experimental”。
如果超时= 800,您应该已经看到< 1min的近似计数。
你确定没有其他因素造成30分钟的减速。 分享您的代码/代码段,以便从其他成员那里获得更准确的输入。
答案 1 :(得分:2)
不是我的答案,但是有一个非常有用且重要的答案here。
在很短的时间内,countApprax.getFinalValue
会阻塞,即使这比超时时间长。
getInitialValue
不会阻止,因此您将在超时内得到响应。
但是,正如我从痛苦的经验中学到的,即使您使用getInitalValue
,该过程也将继续发挥最终价值。
如果要在循环中重复此操作,则从getFinalValue
中检索结果后,getInitialValue
将运行多个RDD。然后,这会导致OOM状况和难以诊断的广播错误
答案 2 :(得分:0)
rdd.count() is an action, which is an eager operation
。
这意味着由于Spark的懒惰评估,您之前编写的所有其他转换现在将开始执行。所以,基本上它不仅是Count()操作,而是所有其他等待执行的操作。
现在回到count()和countApprox()的问题。 Count就像从Table中选择count(*)一样。 countApprox可以具有超时和置信度,返回大致正确的结果和您可以使用的数字。
当我们更想知道一个近似数字并节省时间时,我们应该使用countApprox,例如在流应用程序中。 当您需要精确计数时,应使用Count(),例如记录某些内容或进行审核。