sim*_*tim 2 scala apache-spark
我正在寻找一种方法来计算一些统计数据,例如使用 Scala 计算 Spark 中几个选定列的平均值。鉴于该data对象是我的 Spark DataFrame,很容易仅计算一列的平均值,例如
data.agg(avg("var1") as "mean var1").show
Run Code Online (Sandbox Code Playgroud)
此外,我们可以轻松计算由其他一些列的值交叉制表的平均值,例如:
data.groupBy("category").agg(avg("var1") as "mean_var1").show
Run Code Online (Sandbox Code Playgroud)
但是我们如何计算 DataFrame 中列列表的平均值呢?我尝试运行这样的东西,但它没有用:
scala> data.select("var1", "var2").mean().show
<console>:44: error: value mean is not a member of org.apache.spark.sql.DataFrame
data.select("var1", "var2").mean().show
^
Run Code Online (Sandbox Code Playgroud)
这是你需要做的
import org.apache.spark.sql.functions._
import spark.implicits._
val df1 = Seq((1,2,3), (3,4,5), (1,2,4)).toDF("A", "B", "C")
data.select(data.columns.map(mean(_)): _*).show()
Run Code Online (Sandbox Code Playgroud)
输出:
+------------------+------------------+------+
| avg(A)| avg(B)|avg(C)|
+------------------+------------------+------+
|1.6666666666666667|2.6666666666666665| 4.0|
+------------------+------------------+------+
Run Code Online (Sandbox Code Playgroud)
这适用于选定的列
data.select(Seq("A", "B").map(mean(_)): _*).show()
Run Code Online (Sandbox Code Playgroud)
输出:
+------------------+------------------+
| avg(A)| avg(B)|
+------------------+------------------+
|1.6666666666666667|2.6666666666666665|
+------------------+------------------+
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!