数据的行列变化:多行数据到一行数据中

【1】数据  文件 rowcolumnData 数据如下

username,item,price
zhangsan,A,1
zhangsan,B,2
zhangsan,C,3
lisi,A,4
lisi,C,5
zhangsan,D,6
lisi,B,7
wangwu,C,8

【2】scala代码实现

  1 package com.it.baizhan.scalacode.sparksql.examples
  2 
  3 import org.apache.spark.sql.SparkSession
  4 
  5 /**
  6   * 数据的行列变化:
  7   *   多行数据到一行数据中
  8   *    例如:
  9   *     +--------+----+-----+           +--------+---------+-----+
 10   *     |username|item|price|           |username|item     |price|
 11   *     +--------+----+-----+           +--------+---------+-----+
 12   *     |zhangsan|   A|    1|           |zhangsan|A,B,C,D |   12|
 13   *     |zhangsan|   B|    2|           |lisi    |A,B,C   |   16|
 14   *     |zhangsan|   C|    3|           |wangwu | C       |    8|
 15   *     |    lisi|   A|    4|           +--------+--------+-----+
 16   *     |    lisi|   C|    5|
 17   *     |zhangsan|   D|    6|
 18   *     |    lisi|   B|    7|
 19   *     |  wangwu|   C|    8|
 20   *     +--------+----+-----+
 21   *     collect_list(item) : 将item数据根据分组合并到一个集合中。
 22   *     collect_set(item)  : 将item数据根据分组合并到一个集合中,相同的数据会去重。
 23   *     concat(xx,xxx... ...) : 拼接字符串
 24   *     concat_ws (分隔符,集合):按照分隔符将集合中的元素进行拼接,返回字符串
 25   *     split(列,"分隔符") : 对某列进行按照分隔符切割得到对应的一个集合
 26   *     explode(集合) : 一变多转换数据
 27   *
 28   */
 29 object RowColumnTransfer1 {
 30   def main(args: Array[String]): Unit = {
 31 //    val session = SparkSession.builder().master("local").appName("test").getOrCreate()
 32 //    val df = session.read.option("header",true).csv("./data/rowcolumnData")
 33     val session = SparkSession.builder().master("local").appName("11").getOrCreate()
 34     val df = session.read.option("header",true).csv("./data/rowcolumnData")
 35     df.createTempView("temp1")
 36 
 37     session.sql(
 38       """
 39         | select
 40         |   username,collect_list(item) as cl ,sum(price) as totalprice
 41         | from temp1
 42         | group by  username
 43       """.stripMargin).createTempView("temp2")
 44 
 45     /**
 46      * +--------+------------+----------+
 47      * |username|          cl|totalprice|
 48      * +--------+------------+----------+
 49      * |  wangwu|         [C]|       8.0|
 50      * |zhangsan|[A, B, C, D]|      12.0|
 51      * |    lisi|   [A, C, B]|      16.0|
 52      * +--------+------------+----------+
 53      */
 54 
 55     session.sql(
 56       """
 57         | select
 58         |   username,concat_ws(",",cl) as cw,totalprice
 59         | from temp2
 60       """.stripMargin).createTempView("temp3")
 61 
 62     /**
 63      * +--------+-------+----------+
 64      * |username|     cw|totalprice|
 65      * +--------+-------+----------+
 66      * |  wangwu|      C|       8.0|
 67      * |zhangsan|A,B,C,D|      12.0|
 68      * |    lisi|  A,C,B|      16.0|
 69      * +--------+-------+----------+
 70      */
 71 
 72 //    session.sql(
 73 //      """
 74 //        | select
 75 //        |   username,explode(split(cw,",")) as item ,totalprice
 76 //        | from temp3
 77 //      """.stripMargin).show(100)
 78     session.sql(
 79       """
 80 
 81         select
 82         username,explode(split(cw,",")) as item ,totalprice
 83         from temp3
 84 
 85 
 86         """).show()
 87   }
 88 
 89   /**
 90    * +--------+----+----------+
 91    * |username|item|totalprice|
 92    * +--------+----+----------+
 93    * |  wangwu|   C|       8.0|
 94    * |zhangsan|   A|      12.0|
 95    * |zhangsan|   B|      12.0|
 96    * |zhangsan|   C|      12.0|
 97    * |zhangsan|   D|      12.0|
 98    * |    lisi|   A|      16.0|
 99    * |    lisi|   C|      16.0|
100    * |    lisi|   B|      16.0|
101    * +--------+----+----------+
102    */
103 }
posted @ 2021-03-04 16:26  大数据程序员  阅读(142)  评论(0编辑  收藏  举报