我有一个数据框,我想从中提取最大值,最小值和计算其中的记录数。
数据框是:
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()
之间的区别是,如果它们提供相同的结果,我应该使用哪一个来获得更好的效果?
答案 0 :(得分:4)
select
用于从dataframe
中选择所需的列,而agg
用于汇总dataframe
在该群组中应用某些functions
的群组。< / p>
在您的情况下,min
,max
和count
在整个dataset
上执行,而select
和agg
都执行相同的操作任务,即将汇总的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."
我希望答案很清楚