Apache spark Spark:rdd.countApprox()与rdd.count()的比较
有人能解释一下RDDCountAbrox()和count()之间的区别吗?如果可能,还可以回答哪一个最快?如果我们有一个要求,count()非常慢,大约需要30分钟**…尝试countApprox(),第一次运行时它**快(**大约1.2分钟),然后慢到30分钟 这就是我们使用它的方式不确定这是否是最好的使用方式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()的近似版本,它在
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%)置信度是无法保证的。一个参数优先吗?是否要等到满足置信度或达到超时?