说我有这样的Spark SQL DataFrame:
name gender grade
-----------------
Joe M 3
Sue F 2
Pam F 3
Gil M 2
Lon F 3
Kim F 3
Zoe F 2
我想创建一个单值的报告,如下所示:
numMales numFemales numGrade2 numGrade3
---------------------------------------
2 5 3 4
最好的方法是什么?我知道如何单独获得其中一个:
val numMales = dataDF.where($"gender" == "M").count
但我真的不知道如何把它放到DataFrame中,或者如何将所有结果组合起来。
答案 0 :(得分:2)
使用when
,sum
和struct
内置功能可以为您提供所需的结果
import org.apache.spark.sql.functions._
dataDF.select(struct(sum(when(col("gender")==="M", 1)).as("numMales"), sum(when(col("gender")==="F", 1)).as("numFemales")).as("genderCounts"),
struct(sum(when(col("grade")===2, 1)).as("numGrade2"), sum(when(col("grade")===3, 1)).as("numGrade3")).as("gradeCounts"))
.select(col("genderCounts.*"), col("gradeCounts.*"))
.show(false)
应该给你
+--------+----------+---------+---------+
|numMales|numFemales|numGrade2|numGrade3|
+--------+----------+---------+---------+
|2 |5 |3 |4 |
+--------+----------+---------+---------+
答案 1 :(得分:1)
你可以爆炸和转动:
import org.apache.spark.sql.functions._
val cols = Seq("gender", "grade")
df
.select(explode(array(cols map (c => concat(lit(c), col(c))): _*)))
.groupBy().pivot("col").count.show
// +-------+-------+------+------+
// |genderF|genderM|grade2|grade3|
// +-------+-------+------+------+
// | 5| 2| 3| 4|
// +-------+-------+------+------+
答案 2 :(得分:0)
我说你需要每列分别.groupBy().count()
数据框,他们会将答案合并到一个新的数据框中。