spark业务开发-行转列
输入数据
subject,name,score
数学,张三,88
语文,张三,92
英语,张三,77
数学,王五,65
语文,王五,87
英语,王五,90
数学,李雷,67
语文,李雷,33
英语,李雷,24
数学,宫九,77
语文,宫九,87
英语,宫九,90
输出数据
+-------+----+----+----+----+
|subject|宫九|张三|李雷|王五|
+-------+----+----+----+----+
| 英语| 90| 77| 24| 90|
| 语文| 87| 92| 33| 87|
| 数学| 77| 88| 67| 65|
+-------+----+----+----+----+
程序代码
package com.cch.bigdata.spark.process.row2col
import com.cch.bigdata.spark.process.AbstractTransform
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions.col
class Row2Col extends AbstractTransform {
private val group_columns = Array[String]("subject")
private val aggregate_column:String = "score"
private val rotation_column:String = "name"
override def process(): Unit = {
val df: DataFrame = loadCsv("src/main/resources/csv/score.csv", spark)
if (group_columns.isEmpty) {
throw new RuntimeException("分组列不能为空")
}
if (aggregate_column.isEmpty) {
throw new RuntimeException("聚合列不能为空")
}
if (rotation_column.isEmpty) {
throw new RuntimeException("旋转列不能为空")
}
df.groupBy(group_columns.map(c => {
col(c)
}): _*).pivot(rotation_column).sum(aggregate_column).show()
}
override def getAppName(): String = "行转列"
}
object Row2Col{
def main(args: Array[String]): Unit = {
new Row2Col().process()
}
}
参数解释
- group_columns:分组列
- aggregate_column:需要对哪个列聚合
- rotation_column:旋转列,将这个列中的值变成列