【发布时间】:2017-10-31 14:45:45
【问题描述】:
在 spark 中,有没有一种快速的方法来获取 Dataset 中元素数量的近似计数?也就是说,比Dataset.count() 快。
也许我们可以根据 DataSet 的分区数来计算这些信息,可以吗?
【问题讨论】:
标签: apache-spark approximation
在 spark 中,有没有一种快速的方法来获取 Dataset 中元素数量的近似计数?也就是说,比Dataset.count() 快。
也许我们可以根据 DataSet 的分区数来计算这些信息,可以吗?
【问题讨论】:
标签: apache-spark approximation
如果您有大量的记录,您可以使用类似HyperLogLog 的方式获得近似计数,这可能比count() 更快。但是,如果不开始工作,您将无法获得任何结果。
在使用 Spark 时,有两种 RDD 操作:transformations 和 actions。粗略地说,转换会修改一个 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。超时时间越长,估计的计数就越准确。
【讨论】:
low 和 high 的平均值,结果会不太精确。
df.rdd 很昂贵