scala – 为什么dataset.count()比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如下: 但是,当我运行ds.rdd.count时,它给了我4s(同一台机器)的结果.但它创建的DAG如下: 所以,我的怀疑是: >为什么ds.rdd.count只创建一个阶段而ds.count创建了两个阶段? 解决方法
这两项计数实际上都是两步操作.不同之处在于,在ds.count的情况下,最终聚合由其中一个执行程序执行,而ds.rdd.countaggregates the final result on the driver,因此此步骤不会反映在DAG中:
同上.此外,ds.rdd.count必须初始化(以及后来的垃圾收集)1亿个Row对象,这几乎不是免费的,并且可能占据了大部分时间差. 最后,类似范围的对象不是一个很好的基准测试工具,除非非常谨慎使用.取决于上下文计数超出范围可以表示为恒定时间操作,即使没有明确的优化也可以非常快(参见例如spark.sparkContext.range(0,1000000).count)但不反映性能与真实工作量. 相关:How to know which count query is the fastest? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |