【问题标题】:In spark, how to estimate the number of elements in a dataframe quickly在spark中,如何快速估计数据框中的元素数量
【发布时间】:2017-10-31 14:45:45
【问题描述】:

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

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

【问题讨论】:

    标签: apache-spark approximation


    【解决方案1】:

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

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

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

    【讨论】:

    • hyperloglog 将计算数据集中不同项目的数量,这不解决 OP 问题
    【解决方案2】:

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

    示例用法:

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

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

    【讨论】:

    • 非常感谢,这正是我想要的。
    • 有点精确。如果像我一样你需要一个数字而不是一个区间,那么你最好将置信度设置为 0(从而获得低和高的单个值)。如果使用较高的值(如默认值 0.95),然后使用 lowhigh 的平均值,结果会不太精确。
    • 我已经在大型数据集上尝试过了,但它似乎并没有节省太多(如果有的话..)时间。
    • 我认为这不会节省太多时间,因为我听说调用 df.rdd 很昂贵
    猜你喜欢
    • 2012-03-22
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多