gpt4 book ai didi

scala - 为什么 dataset.count() 比 rdd.count() 快?

转载 作者:行者123 更新时间:2023-12-04 17:31:27 27 4
gpt4 key购买 nike

我创建了一个 Spark Dataset[Long] :

scala> val ds = spark.range(100000000)
ds: org.apache.spark.sql.Dataset[Long] = [id: bigint]

当我跑 ds.count它给了我 0.2s 的结果(在 4 核 8GB 机器上)。此外,它创建的 DAG 如下:

enter image description here

但是,当我跑 ds.rdd.count它给了我 4s 的结果(同一台机器)。但是它创建的DAG是这样的:

enter image description here

所以,我的疑惑是:
  • 为什么ds.rdd.count仅创建一个阶段,而 ds.count正在创建 2 个阶段?
  • 此外,当 ds.rdd.count只有一个阶段,那么为什么它比 ds.count 慢其中有 2 个阶段?
  • 最佳答案

    Why ds.rdd.count is creating only one stage whereas ds.count is creating 2 stages ?



    这两个计数实际上都是两步操作。区别在于 ds.count的情况下,最终聚合由其中一个执行者执行,而 ds.rdd.count aggregates the final result on the driver ,因此这一步没有反射(reflect)在 DAG 中:

    Also, when ds.rdd.count is having only one stage then why it is slower



    同上。此外 ds.rdd.count必须初始化(以及后来的垃圾收集) 1 亿 Row对象,几乎是免费的,并且可能占了这里的大部分时间差异。

    最后 range -like 对象不是一个好的基准测试工具,除非非常谨慎地使用。根据上下文计数,范围内可以表示为恒定时间操作,即使没有显式优化也可以非常快(参见例如 spark.sparkContext.range(0, 100000000).count),但不会反射(reflect)实际工作负载的性能。

    相关: How to know which count query is the fastest?

    关于scala - 为什么 dataset.count() 比 rdd.count() 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43949980/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com