我有一个从蜂巢表创建的数据框,如下所示:
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
有人可以在这里解释我在做什么错!!
答案 0 :(得分:2)
考虑计算结果所需的数量时,原因很明显。
第一条语句只需检查最小分区数(可能是一个)即可收集20条记录(show
返回的默认行数)
第二条语句必须:
第一种情况几乎是便宜的,第二种情况只有完全洗牌才能超过。