加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:51:53 所属栏目:安全 来源:网络整理
导读:我创建了一个Spark数据集[Long]: scala val ds = spark.range(100000000)ds: org.apache.spark.sql.Dataset[Long] = [id: bigint] 当我运行ds.count时,它给了我0.2s的结果(在4 Core 8GB机器上).此外,它创建的DAG如下: 但是,当我运行ds.rdd.count时,它给了
我创建了一个Spark数据集[Long]:

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

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

enter image description here

但是,当我运行ds.rdd.count时,它给了我4s(同一台机器)的结果.但它创建的DAG如下:

enter image description here

所以,我的怀疑是:

>为什么ds.rdd.count只创建一个阶段而ds.count创建了两个阶段?
>另外,当ds.rdd.count只有一个阶段时,为什么它比ds.count慢两个阶段呢?

解决方法

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

这两项计数实际上都是两步操作.不同之处在于,在ds.count的情况下,最终聚合由其中一个执行程序执行,而ds.rdd.countaggregates the final result on the driver,因此此步骤不会反映在DAG中:

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

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

最后,类似范围的对象不是一个很好的基准测试工具,除非非常谨慎使用.取决于上下文计数超出范围可以表示为恒定时间操作,即使没有明确的优化也可以非常快(参见例如spark.sparkContext.range(0,1000000).count)但不反映性能与真实工作量.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读