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
}