Apache spark 在spark中,如何快速估计数据帧中的元素数

Apache spark 在spark中,如何快速估计数据帧中的元素数,apache-spark,approximation,Apache Spark,Approximation,在spark中,是否有一种快速的方法来获得数据集中元素数量的近似计数?也就是说,比Dataset.count()的速度快 也许我们可以根据数据集的分区数来计算这些信息,可以吗?如果您有大量的记录,您可以使用类似的方法获得近似计数,这可能比count()更快。然而,如果不开始工作,你将无法获得任何结果 使用Spark时,有两种RDD操作:和。粗略地说,转换修改RDD并返回新的RDD。动作计算或产生一些结果。转换是惰性地进行评估的,因此在一系列转换结束时将某个操作称为操作之前,转换不会启动作业 因为

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


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

如果您有大量的记录,您可以使用类似的方法获得近似计数,这可能比
count()
更快。然而,如果不开始工作,你将无法获得任何结果

使用Spark时,有两种RDD操作:和。粗略地说,转换修改RDD并返回新的RDD。动作计算或产生一些结果。转换是惰性地进行评估的,因此在一系列转换结束时将某个操作称为操作之前,转换不会启动作业


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

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

用法示例:

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

您必须对参数
timeout
confidence
进行一些处理。超时越高,估计的计数就越准确。

非常感谢,这正是我想要的。有点精确。如果像我一样,你需要一个单一的数字,而不是一个区间,那么你最好将置信度设置为0(从而得到一个单一的高低值)。如果使用一个高值(如默认值0.95),然后使用
low
high
的平均值,结果将不那么精确。我在大型数据集上尝试过这一方法,它似乎不会节省太多时间(如果有的话)。我认为这不会节省太多时间,因为我读到调用
df.rdd
的成本很高