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()如果它们提供相同的结果,我应该使用哪一个以获得更好的性能?
select用于从 a 中选择所需的列dataframe,而agg用于聚合组并在该组上dataframe应用一些列functions。
在您的情况下,min和max是count整体执行的dataset,并且两者select都agg执行相同的任务,即将聚合转换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."
我希望答案是明确的
| 归档时间: |
|
| 查看次数: |
3179 次 |
| 最近记录: |