我创建了一个 Spark
当我运行
Dataset[Long]
:scala> val ds = spark.range(100000000)
ds: org.apache.spark.sql.Dataset[Long] = [id: bigint]
当我运行
ds.count
时,它在4核8GB的机器上用0.2s
返回结果。同时,它创建的DAG如下所示:
但是,当我运行ds.rdd.count
时,它在同样的机器上用4s
返回结果。但是它创建的DAG如下所示:
所以,我的疑问是:
- 为什么
ds.rdd.count
只创建一个stage,而ds.count
创建了2个stage? - 此外,当
ds.rdd.count
只有一个stage时,为什么比有2个stage的ds.count
更慢?
ds.rdd.count
非常慢,因为需要评估整个数据集(即所有行的所有列),尽管这并不是获取行数所必需的。数据集/数据框架API可以大大优化此查询(另请参见https://dev59.com/OVgQ5IYBdhLWcg3weD2E)。 - Raphael Roth