案例: 找出变化的行 (高频面试知识点)

开窗函数 + 表的自关联实现
【1】数据 文件test.csv数据如下
ID,CHANGE,NAME
id1,1,a
id1,1,b
id1,1,c
id1,2,d
id1,2,e
id1,1,f
id2,2,g
id2,2,h
id2,1,i
id2,1,j
id2,2,k
id3,1,l
id3,1,m
id3,2,n
id3,3,o
id3,4,p
【2】代码实现
 1 package com.it.baizhan.scalacode.sparksql.examples
 2 
 3 import org.apache.spark.sql.SparkSession
 4 
 5 /**
 6   * 案例: 找出变化的行  (高频面试知识点)
 7   *   开窗函数 + 表的自关联实现
 8   */
 9 object FindChangeInfos {
10   def main(args: Array[String]): Unit = {
11     val session = SparkSession.builder().master("local").appName("test").getOrCreate()
12     session.sparkContext.setLogLevel("Error")
13     val frame = session.read.option("header",true).csv("./data/test.csv")
14     frame.createTempView("temp")
15     session.sql(
16       """
17         |select id,change,name,row_number() over(partition by id order by name ) as rank
18         |from temp
19       """.stripMargin).createTempView("t")
20 
21     /**
22      * +---+------+----+----+
23      * | id|change|name|rank|
24      * +---+------+----+----+
25      * |id3|     1|   l|   1|
26      * |id3|     1|   m|   2|
27      * |id3|     2|   n|   3|
28      * |id3|     3|   o|   4|
29      * |id3|     4|   p|   5|
30      * |id1|     1|   a|   1|
31      * |id1|     1|   b|   2|
32      * |id1|     1|   c|   3|
33      * |id1|     2|   d|   4|
34      * |id1|     2|   e|   5|
35      * |id1|     1|   f|   6|
36      * |id2|     2|   g|   1|
37      * |id2|     2|   h|   2|
38      * |id2|     1|   i|   3|
39      * |id2|     1|   j|   4|
40      * |id2|     2|   k|   5|
41      * +---+------+----+----+
42      */
43     session.sql(
44       """
45         | select a.id,a.change,a.name
46         | from t a join t b on a.id = b.id
47         | where a.change != b.change and a.rank = b.rank-1
48       """.stripMargin).show()
49   }
50 
51   /**
52    * +---+------+----+
53    * | id|change|name|
54    * +---+------+----+
55    * |id3|     1|   m|
56    * |id3|     2|   n|
57    * |id3|     3|   o|
58    * |id1|     1|   c|
59    * |id1|     2|   e|
60    * |id2|     2|   h|
61    * |id2|     1|   j|
62    * +---+------+----+
63    */
64 
65 }

 

 
posted @ 2021-03-04 10:46  大数据程序员  阅读(53)  评论(0编辑  收藏  举报