spark业务开发-行转列

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:旋转列,将这个列中的值变成列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值