数据的行列变化:多行数据到一行数据中
【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 }