首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么dataset.count()比rdd.count()更快?

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

Stack Overflow用户
提问于 2017-05-13 06:29:35
回答 1查看 8.7K关注 0票数 8

我创建了一个星火Dataset[Long]

代码语言:javascript
复制
scala> val ds = spark.range(100000000)
ds: org.apache.spark.sql.Dataset[Long] = [id: bigint]

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

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

因此,我的怀疑是:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-13 13:09:18

为什么ds.rdd.count只创建了一个阶段,而ds.count创建了两个阶段?

这两个计数实际上是两步操作。不同的是,对于ds.count,最终聚合由一个执行器执行,而ds.rdd.count聚合驱动程序上的最终结果。,因此这个步骤没有反映在DAG中:

另外,当ds.rdd.count只有一个阶段时,为什么它要慢一些?

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

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

相关:如何知道哪个计数查询最快?

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43949980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档