spark pivot透视操作(转横表)

spark | 2021-09-16 21:41:50

1.什么是pivot透视操作

通常pivot透视操作成为转横表操作

假如有原始表originalTable:

我需要得到透视表pivotTable1:

甚至我还可以进行一次透视操作得到pivotTable2:

2.spark自带pivot函数

org.apache.spark.sql.RelationalGroupedDataset自带pivot函数

实现上面的效果自需要调用两次pivot函数

pivotTable1=originalTable.groupBy("A","B").pivot("C").max()或者

还可以这样写:

pivotTable1=originalTable.groupBy("A","B").pivot("C").agg(Map(("D","first")))

接着二次转表

pivotTable2=pivotTable1.groupBy("A").pivot("B").max()

 

我写了一个公用方法

  def pivotTable(df: DataFrame, groupFields: Seq[String], pivotField: String, valueFields: Seq[String]): DataFrame = {
    val resDf = if (valueFields == null || valueFields.isEmpty) {
      var pivotDf = df.groupBy(groupFields.map(col): _*).pivot(pivotField).max()
      pivotDf.schema.fieldNames.foreach(fieldName => {
        pivotDf = pivotDf.withColumnRenamed(fieldName, fieldName.replace("max(", "").replace(")", ""))
      })
      pivotDf
    } else {
      var pivotDf = df.groupBy(groupFields.map(col): _*).pivot(pivotField).agg(Map(valueFields.map((_, "first")): _*))

      pivotDf.schema.fieldNames.foreach(fieldName => {
        pivotDf = pivotDf.withColumnRenamed(fieldName, fieldName.replace("first(", "").replace("false)", "").replace(" ", "").replace(",", ""))
      })
      pivotDf
    }
    resDf
  }

 

登录后即可回复 登录 | 注册
    
关注编程学问公众号