Apache spark Spark:rdd.countApprox()与rdd.count()的比较

Apache spark Spark:rdd.countApprox()与rdd.count()的比较,apache-spark,spark-streaming,Apache Spark,Spark Streaming,有人能解释一下RDDCountAbrox()和count()之间的区别吗?如果可能,还可以回答哪一个最快?如果我们有一个要求,count()非常慢,大约需要30分钟**…尝试countApprox(),第一次运行时它**快(**大约1.2分钟),然后慢到30分钟 这就是我们使用它的方式不确定这是否是最好的使用方式 rdd.countApprox(timeout=800, confidence=0.5) Count()-返回RDD中的元素数 CountAbrox—count()的近似版本,它在

有人能解释一下RDDCountAbrox()和count()之间的区别吗?如果可能,还可以回答哪一个最快?如果我们有一个要求,count()非常慢,大约需要30分钟**…尝试countApprox(),第一次运行时它**快(**大约1.2分钟),然后慢到30分钟

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

rdd.countApprox(timeout=800, confidence=0.5)
  • Count()-返回RDD中的元素数
  • CountAbrox—count()的近似版本,它在超时时间内返回可能不完整的结果,即使并非所有任务都已完成
countApprox(超时:长,置信度:双)

默认值:置信度=0.95

注意:根据spark源代码,CountAbrox的支持标记为“实验”

当timeout=800时,您应该在rdd中看到一个近似计数。count()是一个动作,是一个急切的操作

这意味着,由于Spark的延迟计算,您以前编写的所有其他转换现在都将开始执行。因此,本质上,不仅仅是占用所有时间的Count()操作,还有等待执行的所有其他操作

现在回到count()与countApprox()的问题。 计数就像从表中选择计数(*)。CountAbrox可以有一个超时和置信度级别,返回一个大致正确的结果和一个您可以接受的数字

我们应该使用countApprox当我们更感兴趣的是知道一个大概的数字,并节省时间,例如在流媒体应用程序中。
Count()应该在您需要精确计数时使用,例如记录某事或进行审计。

不是我的答案,但有一个非常有用和重要的答案

简而言之,
countApprax.getFinalValue
即使比超时时间长,也会阻塞

getInitialValue
不会阻塞,因此您将在超时时间内得到响应

但是,正如我从痛苦的经历中学到的,即使使用
getInitalValue
这个过程也会继续到最终值


如果在循环中重复此操作,
getFinalValue
将在从
getInitialValue
检索结果后很长时间内运行多个RDD。这会导致OOM条件和广播错误,难以诊断。

FYI:超时以毫秒为单位。显示超时和置信度是否适用?显然,1ms和1.0(100%)置信度是无法保证的。一个参数优先吗?是否要等到满足置信度或达到超时?