在spark中,如何快速估算数据框中的元素数量

时间:2017-05-31 00:27:44

标签: apache-spark approximation

在spark中,有一种快速的方法可以获得数据集中元素数量的近似计数吗?也就是说,比Dataset.count()更快。

也许我们可以根据DataSet的分区数来计算这些信息,对吗?

2 个答案:

答案 0 :(得分:5)

您可以尝试在RDD API上使用countApprox,尽管这也会启动Spark作业,它应该更快,因为它只是给出您想要花费的给定时间的真实计数的估计值(毫秒) )和置信区间(即真值在该范围内的概率):

示例用法:

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

您必须使用参数timeoutconfidence。超时越高,估计的计数越准确。

答案 1 :(得分:1)

如果您拥有真正数量庞大的记录,则可以使用HyperLogLog之类的内容获得大致计数,这可能比count()更快。但是,如果不开始工作,您将无法获得任何结果。

使用Spark时,有两种RDD操作:transformationsactions。粗略地说,转换会修改RDD并返回新的RDD。动作计算或生成一些结果。转换被懒惰地评估,因此它们不会启动作业,直到在一系列转换结束时将动作称为动作。

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