df.select()和df.agg()有什么区别?

时间:2017-06-19 04:42:27

标签: scala apache-spark apache-spark-sql aggregate-functions

我有一个数据框,我想从中提取最大值,最小值和计算其中的记录数。

数据框是:

scala> val df = spark.range(10000)
df: org.apache.spark.sql.Dataset[Long] = [id: bigint]

为了获得所需的值,我使用df.select(),如下所示:

scala> df.select(min("id"), max("id"), count("id")).show
+-------+-------+---------+
|min(id)|max(id)|count(id)|
+-------+-------+---------+
|      0|   9999|    10000|
+-------+-------+---------+

这给了我正确的结果,但是当我尝试df.agg()时,它也给了我相同的答案。

scala> df.agg(min("id"), max("id"), count("id")).show
+-------+-------+---------+
|min(id)|max(id)|count(id)|
+-------+-------+---------+
|      0|   9999|    10000|
+-------+-------+---------+

所以,我的问题是df.select()df.agg()之间的区别是,如果它们提供相同的结果,我应该使用哪一个来获得更好的效果?

1 个答案:

答案 0 :(得分:4)

select用于从dataframe中选择所需的列,而agg用于汇总dataframe在该群组中应用某些functions的群组。< / p>

在您的情况下,minmaxcount在整个dataset上执行,而selectagg都执行相同的操作任务,即将汇总的dataframe转换为新的dataframe

当我们必须对数据组执行aggregations时,真正的区别将会很明显。您可以对分组agg执行dataframe,但无法对分组select执行dataframe。可以对select指向的整个dataset执行pointer查询。

如果您结帐grouped dataframe,则可以将定义视为"A set of methods for aggregations on a DataFrame, created by DataFrame.groupBy. The main method is the agg function, which has multiple variants. This class also contains convenience some first order statistics such as mean, sum for convenience."

我希望答案很清楚