为什么Spark运行相同命令的速度很慢?

时间:2018-08-02 11:15:47

标签: scala apache-spark dataframe apache-spark-sql

我有一个从蜂巢表创建的数据框,如下所示:

import org.apache.spark.sql.hive.HiveContext
import sqlContext.implicits._

val hiveObj = new HiveContext(sc)
val df = hiveObj.sql("select * from database.table")

这里的df大约有200万行;
因此,我从上方的subdf创建了一个子数据帧df,并将行数限制为500,如下所示:

import org.apache.spark.sql.functions.rand

val subdf =df.orderBy(rand()).limit(500)

现在,当我尝试显示df行时,我花了第二秒钟;而当我尝试对subdf做同样的事情时,尽管行数很多,但实际上花了我10多分钟很小。

df.select("col").show() //2sec
subdf.select("col").show() //more than 10 min

有人可以在这里解释我在做什么错!!

1 个答案:

答案 0 :(得分:2)

考虑计算结果所需的数量时,原因很明显。

  • 第一条语句只需检查最小分区数(可能是一个)即可收集20条记录(show返回的默认行数)

  • 第二条语句必须:

    • 加载所有记录。
    • 按照顺序从每个分区中查找前500条记录。
    • 将记录改组到单个分区。
    • 获取最终500条记录。
    • 打印20条记录。

第一种情况几乎是便宜的,第二种情况只有完全洗牌才能超过。