在spark中,如何快速估计数据框中的元素数量
In spark, how to estimate the number of elements in a dataframe quickly
在 spark 中,有没有快速的方法来获取 Dataset 中元素数量的近似计数?也就是说,比 Dataset.count()
快。
也许我们可以根据 DataSet 的分区数计算出这些信息,我们可以吗?
如果您有大量的记录,您可以使用 HyperLogLog 之类的方法得到一个大概的计数,这可能比 count()
更快。但是,如果不开始工作,您将无法获得任何结果。
使用 Spark 时有两种 RDD 操作:transformations and actions。粗略地说,转换修改一个 RDD 和 return 一个新的 RDD。行动计算或产生一些结果。转换是延迟评估的,因此它们不会开始工作,直到在一系列转换结束时调用一个动作。
由于 Spark 是一个分布式编程框架,运行 个作业的开销很大。如果你需要一些感觉更像 "real time" 的东西,无论这意味着什么,如果你的数据足够小,要么使用基本的 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
。超时时间越长,估计的计数越准确。
在 spark 中,有没有快速的方法来获取 Dataset 中元素数量的近似计数?也就是说,比 Dataset.count()
快。
也许我们可以根据 DataSet 的分区数计算出这些信息,我们可以吗?
如果您有大量的记录,您可以使用 HyperLogLog 之类的方法得到一个大概的计数,这可能比 count()
更快。但是,如果不开始工作,您将无法获得任何结果。
使用 Spark 时有两种 RDD 操作:transformations and actions。粗略地说,转换修改一个 RDD 和 return 一个新的 RDD。行动计算或产生一些结果。转换是延迟评估的,因此它们不会开始工作,直到在一系列转换结束时调用一个动作。
由于 Spark 是一个分布式编程框架,运行 个作业的开销很大。如果你需要一些感觉更像 "real time" 的东西,无论这意味着什么,如果你的数据足够小,要么使用基本的 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
。超时时间越长,估计的计数越准确。