Spark DataFrame摘要

时间:2018-05-11 16:27:56

标签: scala apache-spark

说我有这样的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中,或者如何将所有结果组合起来。

3 个答案:

答案 0 :(得分:2)

使用whensumstruct 内置功能可以为您提供所需的结果

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()数据框,他们会将答案合并到一个新的数据框中。