开窗函数 + 表的自关联实现
【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 }