在spark中,有一种快速的方法可以获得数据集中元素数量的近似计数吗?也就是说,比Dataset.count()
更快。
也许我们可以根据DataSet的分区数来计算这些信息,对吗?
答案 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)
您必须使用参数timeout
和confidence
。超时越高,估计的计数越准确。
答案 1 :(得分:1)
如果您拥有真正数量庞大的记录,则可以使用HyperLogLog之类的内容获得大致计数,这可能比count()
更快。但是,如果不开始工作,您将无法获得任何结果。
使用Spark时,有两种RDD操作:transformations和actions。粗略地说,转换会修改RDD并返回新的RDD。动作计算或生成一些结果。转换被懒惰地评估,因此它们不会启动作业,直到在一系列转换结束时将动作称为动作。
因为Spark是一个分布式编程框架,所以运行作业会有很多开销。如果您需要的东西感觉更像是“实时”,无论这意味着什么,如果您的数据足够小,可以使用基本的Scala(或Python),或者转移到流式方法,并在新记录流过时执行更新计数器等操作。