【发布时间】:2019-10-07 03:48:14
【问题描述】:
我有一个包含十亿条记录的数据框,我想从中取出 10 条记录。
哪种方法更好更快?
df.take(10) 或 df.limit(10).collect()?
【问题讨论】:
标签: scala dataframe apache-spark apache-spark-sql
我有一个包含十亿条记录的数据框,我想从中取出 10 条记录。
哪种方法更好更快?
df.take(10) 或 df.limit(10).collect()?
【问题讨论】:
标签: scala dataframe apache-spark apache-spark-sql
这两种方法将产生相同的性能,这仅仅是因为它们的实现是相同的。
来自 github 上的 Spark 实现
def take(n: Int): Array[T] = head(n)
虽然head的实现是:
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
如您所见,head 正是使用limit+collect 实现的。
因此它们的性能相同,您测量的差异必须是随机变化,尝试多次运行实验以克服它。
【讨论】:
Spark 进行惰性进化。因此,无论您使用哪个 API,两者都会为您提供相同的结果和相同的性能。
【讨论】:
使用 take(10),它应该是瞬时的。
myDataFrame.take(10) //Action
df.limit(10) //Transformation
【讨论】: