spark sql实战—如何把聚合操作用到多个列上

概述

有时我们希望某个聚合操作,比如:sum,avg等,能够作用到多个列上,也就是一次计算一个或多个列的聚合值。这样可以简化我们的代码。
本文讲述如何在实战中把聚合操作使用到多个列上。

实战

19.如何把聚合函数使用到多个列上?
  • python的写法
>>> df = spark.createDataFrame([(1.0, 0.3, 1.0), (1.0, 0.5, 0.0), (-1.0, 0.6, 0.5), (-1.0, 5.6, 0.2)],("col1", "col2", "col3"))
>>> df.show()
+----+----+----+
|col1|col2|col3|
+----+----+----+
| 1.0| 0.3| 1.0|
| 1.0| 0.5| 0.0|
|-1.0| 0.6| 0.5|
|-1.0| 5.6| 0.2|
+----+----+----+

>>> df.groupBy("col1").sum().show()
+----+---------+-----------------+---------+
|col1|sum(col1)|        sum(col2)|sum(col3)|
+----+---------+-----------------+---------+
|-1.0|     -2.0|6.199999999999999|      0.7|
| 1.0|      2.0|              0.8|      1.0|
+----+---------+-----------------+---------+

>>> df.groupBy("col1").sum("col1", "col2").show()
+----+---------+-----------------+
|col1|sum(col1)|        sum(col2)|
+----+---------+-----------------+
|-1.0|     -2.0|6.199999999999999|
| 1.0|      2.0|              0.8|
+----+---------+-----------------+
  • scala的写法
scala> val df = sc.parallelize(Seq((1.0, 0.3, 1.0), (1.0, 0.5, 0.0),(-1.0, 0.6, 0.5), (-1.0, 5.6, 0.2))).toDF("col1", "col2", "col3")
df: org.apache.spark.sql.DataFrame = [col1: double, col2: double ... 1 more field]

scala> df.groupBy($"col1").min().show
+----+---------+---------+---------+                                            
|col1|min(col1)|min(col2)|min(col3)|
+----+---------+---------+---------+
|-1.0|     -1.0|      0.6|      0.2|
| 1.0|      1.0|      0.3|      0.0|
+----+---------+---------+---------+

小结:默认groupBy后的计算函数都是作用于所有列的,你可以指定需要作用于那些列。

不同列使用不同的聚合函数(仅对scala有效):

可以对不同的列使用不同的聚合函数,代码如下:

scala> df.groupBy($"col1").agg(min($"col2"), sum($"col3")).show
+----+---------+---------+
|col1|min(col2)|sum(col3)|
+----+---------+---------+
|-1.0|      0.6|      0.7|
| 1.0|      0.3|      1.0|
+----+---------+---------+

小结

本文介绍了如何把多个聚合函数使用到不同列的方法。

你可能感兴趣的:(spark,sql实战)