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

him*_*ian 2 scala aggregate-functions apache-spark apache-spark-sql

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

数据框是:

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

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

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

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

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

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

Ram*_*jan 5

select用于从 a 中选择所需的列dataframe,而agg用于聚合组并在该组上dataframe应用一些列functions

在您的情况下,minmaxcount整体执行的dataset,并且两者selectagg执行相同的任务,即将聚合转换dataframe为新的dataframe

当我们必须执行一aggregations组数据时,真正的差异将会很明显。您可以agg对 grouped执行,但不能对 groupeddataframe执行。可以对a 指向的整体执行查询。selectdataframeselectdatasetpointer

如果您签出分组数据框,您可以看到定义为"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."

我希望答案是明确的