2017-05-31 61 views

回答

3

你可以尝试在RDD API上使用countApprox,尽管这也会启动一个Spark作业,它应该更快,因为它只是给你估计一个给定时间的真实数量(毫秒)和一个置信区间(即probabilty,真正的价值在于范围内):

用法示例:

val cntInterval = df.rdd.countApprox(timeout = 1000L,confidence = 0.90) 
val (lowCnt,highCnt) = (cntInterval.initialValue.low, cntInterval.initialValue.high) 

你要玩一点与参数timeoutconfidence。超时越高,估计的计数越准确。

+0

非常感谢你,这正是我所期待的。 – lovasoa

+0

有点精确。如果像我一样,你需要一个单一的数字,而不是一个间隔,比你最好把信心设置为0(从而得到低和高的单个数值)。如果您使用较高的值(例如0.95的默认值),然后使用“低”和“高”的平均值,则结果将不够精确。 – lovasoa

1

如果您的记录数量确实很多,则可以使用类似HyperLogLog这样的近似计数,这可能会比count()更快。但是,如果不开始工作,你将无法获得任何结果。

使用Spark时,有两种RDD操作:transformationsactions。粗略地说,转换修改RDD并返回一个新的RDD。操作计算或生成一些结果。转换被懒惰地评估,所以他们不会开始工作,直到一个动作被称为一系列转换结束时的动作。

因为Spark是一个分布式编程框架,所以运行作业有很多开销。如果你需要更像“实时”的东西,无论是什么意思,如果数据足够小,可以使用基本的Scala(或Python),或者转向流式方法,并执行一些操作,例如在新记录流过时更新计数器。