Spark:rdd.countApprox()vs rdd.count()

时间:2017-03-07 18:53:08

标签: apache-spark spark-streaming

有人可以解释RDD countApprox()与count()之间的区别,如果可能的话,可以回答哪个是最快的?我们有一个非常有帮助的地方 count()非常慢需要大约30分钟... ...尝试countApprox()它是第一次运行快**(**关于1.2分钟)然后放慢到 30分钟 .....

这就是我们使用它的方式,不确定它是否是最好的使用方式

rdd.countApprox(timeout=800, confidence=0.5)

3 个答案:

答案 0 :(得分:4)

  • Count() - 返回RDD中元素的数量。
  • CountApprox - 即使并非所有任务都已完成,也会在超时内返回可能不完整的结果的count()的近似版本。

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(),例如记录某些内容或进行审核。