首页 > 其他分享 >Hive - 窗口函数

Hive - 窗口函数

时间:2024-01-25 13:46:37浏览次数:33  
标签:窗口 函数 department1 Hive department2 69 class2 math class1

 

 

 

1、窗口函数

分组,分组聚合,聚合开窗函数和排序开窗函数

 create table student_scores(
 id int,
 studentId int,
 language int,
 math int,
 english int,
 classId string,
 departmentId string
 );
 id studentId language math english classId departmentId
 1,111,68,69,90,'class1','department1'
 2,112,73,80,96,'class1','department1'
 3,113,90,74,75,'class1','department1'
 4,114,89,94,93,'class1','department1'
 5,115,99,93,89,'class1','department1'
 6,121,96,74,79,'class2','department1'
 7,122,89,86,85,'class2','department1'
 8,123,70,78,61,'class2','department1'
 9,124,76,70,76,'class2','department1'
 10,211,89,93,60,'class1','department2'
 11,212,76,83,75,'class1','department2'
 12,213,71,94,90,'class1','department2'
 13,214,94,94,66,'class1','department2'
 14,215,84,82,73,'class1','department2'
 15,216,85,74,93,'class1','department2'
 16,221,77,99,61,'class2','department2'
 17,222,80,78,96,'class2','department2'
 18,223,79,74,96,'class2','department2'
 19,224,75,80,78,'class2','department2'
 20,225,82,85,63,'class2','department2'

 

 

a、count 开窗函数
 select studentId,math,departmentId,classId,
 count(math) over() as count1,
 count(math) over(partition by classId) as count2,
 count(math) over(partition by classId order by math) as count3,
 count(math) over(partition by classId order by math rows between 1 preceding and 2 following) as count4
 from student_scores where departitionId = 'department1';
 ​
 ​
 studentid   math    departmentid    classid count1  count2  count3  count4
 111         69      department1     class1  9       5       1       3
 113         74      department1     class1  9       5       2       4
 112         80      department1     class1  9       5       3       4
 115         93      department1     class1  9       5       4       3
 114         94      department1     class1  9       5       5       2
 124         70      department1     class2  9       4       1       3
 121         74      department1     class2  9       4       2       4
 123         78      department1     class2  9       4       3       3
 122         86      department1     class2  9       4       4       2

 

 

b、sum 开窗函数
 select studentId,math,departmentId,classId,
 -- 以符合条件的所有行作为窗口
 sum(math) over() as sum1,
 -- 以按classId分组的所有行作为窗口
 sum(math) over(partition by classId) as sum2,
  -- 以按classId分组、按math排序后、按到当前行(含当前行)的所有行作为窗口
 sum(math) over(partition by classId order by math) as sum3,
  -- 以按classId分组、按math排序后、按当前行+往前1行+往后2行的行作为窗口
 sum(math) over(partition by classId order by math rows between 1 preceding and 2 following) as sum4
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid sum1    sum2    sum3    sum4
 111         69      department1     class1  718     410     69      223
 113         74      department1     class1  718     410     143     316
 112         80      department1     class1  718     410     223     341
 115         93      department1     class1  718     410     316     267
 114         94      department1     class1  718     410     410     187
 124         70      department1     class2  718     308     70      222
 121         74      department1     class2  718     308     144     308
 123         78      department1     class2  718     308     222     238
 122         86      department1     class2  718     308     308     164
 ​

 

c、min 开窗函数
 -- min 开窗函数
 ​
 select studentId,math,departmentId,classId,
 -- 以符合条件的所有行作为窗口
 min(math) over() as min1,
 -- 以按classId分组的所有行作为窗口
 min(math) over(partition by classId) as min2,
  -- 以按classId分组、按math排序后、按到当前行(含当前行)的所有行作为窗口
 min(math) over(partition by classId order by math) as min3,
  -- 以按classId分组、按math排序后、按当前行+往前1行+往后2行的行作为窗口
 min(math) over(partition by classId order by math rows between 1 preceding and 2 following) as min4
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid min1    min2    min3    min4
 111         69      department1     class1  69      69      69      69
 113         74      department1     class1  69      69      69      69
 112         80      department1     class1  69      69      69      74
 115         93      department1     class1  69      69      69      80
 114         94      department1     class1  69      69      69      93
 124         70      department1     class2  69      70      70      70
 121         74      department1     class2  69      70      70      70
 123         78      department1     class2  69      70      70      74
 122         86      department1     class2  69      70      70      78
 ​
 结果解释:
     同count开窗函数

 

d、max 开窗函数
 -- max 开窗函数
 ​
 select studentId,math,departmentId,classId,
 -- 以符合条件的所有行作为窗口
 max(math) over() as max1,
 -- 以按classId分组的所有行作为窗口
 max(math) over(partition by classId) as max2,
  -- 以按classId分组、按math排序后、按到当前行(含当前行)的所有行作为窗口
 max(math) over(partition by classId order by math) as max3,
  -- 以按classId分组、按math排序后、按当前行+往前1行+往后2行的行作为窗口
 max(math) over(partition by classId order by math rows between 1 preceding and 2 following) as max4
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid max1    max2    max3    max4
 111         69      department1     class1  94      94      69      80
 113         74      department1     class1  94      94      74      93
 112         80      department1     class1  94      94      80      94
 115         93      department1     class1  94      94      93      94
 114         94      department1     class1  94      94      94      94
 124         70      department1     class2  94      86      70      78
 121         74      department1     class2  94      86      74      86
 123         78      department1     class2  94      86      78      86
 122         86      department1     class2  94      86      86      86
 ​
 结果解释:
     同count开窗函数

 

 

e、avg 开窗函数
 -- avg 开窗函数
 ​
 select studentId,math,departmentId,classId,
 -- 以符合条件的所有行作为窗口
 avg(math) over() as avg1,
 -- 以按classId分组的所有行作为窗口
 avg(math) over(partition by classId) as avg2,
  -- 以按classId分组、按math排序后、按到当前行(含当前行)的所有行作为窗口
 avg(math) over(partition by classId order by math) as avg3,
  -- 以按classId分组、按math排序后、按当前行+往前1行+往后2行的行作为窗口
 avg(math) over(partition by classId order by math rows between 1 preceding and 2 following) as avg4
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid avg1                avg2    avg3                avg4
 111         69      department1     class1  79.77777777777777   82.0    69.0                74.33333333333333
 113         74      department1     class1  79.77777777777777   82.0    71.5                79.0
 112         80      department1     class1  79.77777777777777   82.0    74.33333333333333   85.25
 115         93      department1     class1  79.77777777777777   82.0    79.0                89.0
 114         94      department1     class1  79.77777777777777   82.0    82.0                93.5
 124         70      department1     class2  79.77777777777777   77.0    70.0                74.0
 121         74      department1     class2  79.77777777777777   77.0    72.0                77.0
 123         78      department1     class2  79.77777777777777   77.0    74.0                79.33333333333333
 122         86      department1     class2  79.77777777777777   77.0    77.0                82.0
 ​
 结果解释:
     同count开窗函数

 

 

f、first_value 开窗函数
 -- first_value 开窗函数
 ​
 select studentId,math,departmentId,classId,
 -- 以符合条件的所有行作为窗口
 first_value(math) over() as first_value1,
 -- 以按classId分组的所有行作为窗口
 first_value(math) over(partition by classId) as first_value2,
  -- 以按classId分组、按math排序后、按到当前行(含当前行)的所有行作为窗口
 first_value(math) over(partition by classId order by math) as first_value3,
  -- 以按classId分组、按math排序后、按当前行+往前1行+往后2行的行作为窗口
 first_value(math) over(partition by classId order by math rows between 1 preceding and 2 following) as first_value4
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid first_value1    first_value2    first_value3    first_value4
 111         69      department1     class1  69              69              69              69
 113         74      department1     class1  69              69              69              69
 112         80      department1     class1  69              69              69              74
 115         93      department1     class1  69              69              69              80
 114         94      department1     class1  69              69              69              93
 124         70      department1     class2  69              74              70              70
 121         74      department1     class2  69              74              70              70
 123         78      department1     class2  69              74              70              74
 122         86      department1     class2  69              74              70              78
 ​
 结果解释:
     studentid=124 first_value1:第一个值是69,first_value2:classId=class1分区 math的第一个值是69。

 

 

g、last_value 开窗函数
 -- last_value 开窗函数
 ​
 select studentId,math,departmentId,classId,
 -- 以符合条件的所有行作为窗口
 last_value(math) over() as last_value1,
 -- 以按classId分组的所有行作为窗口
 last_value(math) over(partition by classId) as last_value2,
  -- 以按classId分组、按math排序后、按到当前行(含当前行)的所有行作为窗口
 last_value(math) over(partition by classId order by math) as last_value3,
  -- 以按classId分组、按math排序后、按当前行+往前1行+往后2行的行作为窗口
 last_value(math) over(partition by classId order by math rows between 1 preceding and 2 following) as last_value4
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid last_value1 last_value2 last_value3 last_value4
 111         69      department1     class1  70          93          69          80
 113         74      department1     class1  70          93          74          93
 112         80      department1     class1  70          93          80          94
 115         93      department1     class1  70          93          93          94
 114         94      department1     class1  70          93          94          94
 124         70      department1     class2  70          70          70          78
 121         74      department1     class2  70          70          74          86
 123         78      department1     class2  70          70          78          86
 122         86      department1     class2  70          70          86          86

 

h、lag 开窗函数
 -- lag 开窗函数
 ​
 select studentId,math,departmentId,classId,
  --窗口内 往上取第二个 取不到时赋默认值60
 lag(math,2,60) over(partition by classId order by math) as lag1,
  --窗口内 往上取第二个 取不到时赋默认值NULL
 lag(math,2) over(partition by classId order by math) as lag2
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid lag1    lag2
 111         69      department1     class1  60      NULL
 113         74      department1     class1  60      NULL
 112         80      department1     class1  69      69
 115         93      department1     class1  74      74
 114         94      department1     class1  80      80
 124         70      department1     class2  60      NULL
 121         74      department1     class2  60      NULL
 123         78      department1     class2  70      70
 122         86      department1     class2  74      74
 ​
 结果解释:
     第3行 lag1:窗口内(69 74 80) 当前行80 向上取第二个值为69
     倒数第3行 lag2:窗口内(70 74) 当前行74 向上取第二个值为NULL

 

 

i、lead 开窗函数
 -- lead开窗函数
 ​
 select studentId,math,departmentId,classId,
  --窗口内 往下取第二个 取不到时赋默认值60
 lead(math,2,60) over(partition by classId order by math) as lead1,
  --窗口内 往下取第二个 取不到时赋默认值NULL
 lead(math,2) over(partition by classId order by math) as lead2
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid lead1   lead2
 111         69      department1     class1  80      80
 113         74      department1     class1  93      93
 112         80      department1     class1  94      94
 115         93      department1     class1  60      NULL
 114         94      department1     class1  60      NULL
 124         70      department1     class2  78      78
 121         74      department1     class2  86      86
 123         78      department1     class2  60      NULL
 122         86      department1     class2  60      NULL
 ​
 结果解释:
     第4行lead1 窗口内向下第二个值为空,赋值60

 

j、cume_dist 开窗函数
 -- cume_dist 开窗函数
 ​
 select studentId,math,departmentId,classId,
 -- 统计小于等于当前分数的人数占总人数的比例
 cume_dist() over(order by math) as cume_dist1,
 -- 统计大于等于当前分数的人数占总人数的比例
 cume_dist() over(order by math desc) as cume_dist2,
 -- 统计分区内小于等于当前分数的人数占总人数的比例
 cume_dist() over(partition by classId order by math) as cume_dist3
 from student_scores where departmentId='department1';
 ​
 结果
 studentid   math    departmentid    classid cume_dist1              cume_dist2          cume_dist3
 111         69      department1     class1  0.1111111111111111      1.0                 0.2
 113         74      department1     class1  0.4444444444444444      0.7777777777777778  0.4
 112         80      department1     class1  0.6666666666666666      0.4444444444444444  0.6
 115         93      department1     class1  0.8888888888888888      0.2222222222222222  0.8
 114         94      department1     class1  1.0                     0.1111111111111111  1.0
 124         70      department1     class2  0.2222222222222222      0.8888888888888888  0.25
 121         74      department1     class2  0.4444444444444444      0.7777777777777778  0.5
 123         78      department1     class2  0.5555555555555556      0.5555555555555556  0.75
 122         86      department1     class2  0.7777777777777778      0.3333333333333333  1.0
 ​
 结果解释:
     第三行:
         cume_dist1=小于等于80的人数为6/总人数9=0.6666666666666666
         cume_dist2=大于等于80的人数为4/总人数9=0.4444444444444444
         cume_dist3=分区内小于等于80的人数为3/分区内总人数5=0.6

 

 

 

2、排序开窗函数

 

 

a、rank 开窗函数
 -- rank 开窗函数
 ​
 select *,
 -- 对全部学生按数学分数排序 
 rank() over(order by math) as rank1,
 -- 对院系 按数学分数排序
 rank() over(partition by departmentId order by math) as rank2,
 -- 对每个院系每个班级 按数学分数排序
 rank() over(partition by departmentId,classId order by math) as rank3
 from student_scores;
 ​
 结果
 ​
 id  studentid   language    math    english     classid departmentid    rank1   rank2   rank3
 1   111         68          69      90          class1  department1     1       1       1
 3   113         90          74      75          class1  department1     3       3       2
 2   112         73          80      96          class1  department1     9       6       3
 5   115         99          93      89          class1  department1     15      8       4
 4   114         89          94      93          class1  department1     17      9       5
 9   124         76          70      76          class2  department1     2       2       1
 6   121         96          74      79          class2  department1     3       3       2
 8   123         70          78      61          class2  department1     7       5       3
 7   122         89          86      85          class2  department1     14      7       4
 15  216         85          74      93          class1  department2     3       1       1
 14  215         84          82      73          class1  department2     11      5       2
 11  212         76          83      75          class1  department2     12      6       3
 10  211         89          93      60          class1  department2     15      8       4
 12  213         71          94      90          class1  department2     17      9       5
 13  214         94          94      66          class1  department2     17      9       5
 18  223         79          74      96          class2  department2     3       1       1
 17  222         80          78      96          class2  department2     7       3       2
 19  224         75          80      78          class2  department2     9       4       3
 20  225         82          85      63          class2  department2     13      7       4
 16  221         77          99      61          class2  department2     20      11      5

 

 

 

b、dense_rank 开窗函数
 -- dense_rank 开窗函数
 ​
 select *,
 -- 对全部学生按数学分数排序
 dense_rank() over(order by math) as dense_rank1,
 -- 对院系 按数学分数排序
 dense_rank() over(partition by departmentId order by math) as dense_rank2,
 -- 对每个院系每个班级 按数学分数排序
 dense_rank() over(partition by departmentId,classId order by math) as dense_rank3
 from student_scores;
 ​
 结果:
 id  studentid   language    math    english classid departmentid    dense_rank1 dense_rank2 dense_rank3
 1   111         68          69      90      class1  department1     1           1           1
 3   113         90          74      75      class1  department1     3           3           2
 2   112         73          80      96      class1  department1     5           5           3
 5   115         99          93      89      class1  department1     10          7           4
 4   114         89          94      93      class1  department1     11          8           5
 9   124         76          70      76      class2  department1     2           2           1
 6   121         96          74      79      class2  department1     3           3           2
 8   123         70          78      61      class2  department1     4           4           3
 7   122         89          86      85      class2  department1     9           6           4
 15  216         85          74      93      class1  department2     3           1           1
 14  215         84          82      73      class1  department2     6           4           2
 11  212         76          83      75      class1  department2     7           5           3
 10  211         89          93      60      class1  department2     10          7           4
 12  213         71          94      90      class1  department2     11          8           5
 13  214         94          94      66      class1  department2     11          8           5
 18  223         79          74      96      class2  department2     3           1           1
 17  222         80          78      96      class2  department2     4           2           2
 19  224         75          80      78      class2  department2     5           3           3
 20  225         82          85      63      class2  department2     8           6           4
 16  221         77          99      61      class2  department2     12          9 

 

 

c、ntile 开窗函数

 

 -- ntile 开窗函数
 ​
 select *,
 -- 对分区内的数据分成两组
 ntile(2) over(partition by departmentid order by math) as ntile1,
 -- 对分区内的数据分成三组
 ntile(3) over(partition by departmentid order by math) as ntile2
 from student_scores;
 ​
 结果
 id  studentid   language    math    english classid departmentid    ntile1  ntile2
 1   111         68          69      90      class1  department1     1       1
 9   124         76          70      76      class2  department1     1       1
 6   121         96          74      79      class2  department1     1       1
 3   113         90          74      75      class1  department1     1       2
 8   123         70          78      61      class2  department1     1       2
 2   112         73          80      96      class1  department1     2       2
 7   122         89          86      85      class2  department1     2       3
 5   115         99          93      89      class1  department1     2       3
 4   114         89          94      93      class1  department1     2       3
 18  223         79          74      96      class2  department2     1       1
 15  216         85          74      93      class1  department2     1       1
 17  222         80          78      96      class2  department2     1       1
 19  224         75          80      78      class2  department2     1       1
 14  215         84          82      73      class1  department2     1       2
 11  212         76          83      75      class1  department2     1       2
 20  225         82          85      63      class2  department2     2       2
 10  211         89          93      60      class1  department2     2       2
 12  213         71          94      90      class1  department2     2       3
 13  214         94          94      66      class1  department2     2       3
 16  221         77          99      61      class2  department2     2       3
 ​
 结果解释:
     第8行
         ntile1:对分区的数据均匀分成2组后,当前行的组排名为2
         ntile2:对分区的数据均匀分成3组后,当前行的组排名为3

 

d、row_number 开窗函数
 -- row_number 开窗函数
 ​
 select studentid,departmentid,classid,math,
 -- 对分区departmentid,classid内的数据按math排序
 row_number() over(partition by departmentid,classid order by math) as row_number
 from student_scores;
 ​
 结果
 studentid   departmentid    classid math    row_number
 111         department1     class1  69      1
 113         department1     class1  74      2
 112         department1     class1  80      3
 115         department1     class1  93      4
 114         department1     class1  94      5
 124         department1     class2  70      1
 121         department1     class2  74      2
 123         department1     class2  78      3
 122         department1     class2  86      4
 216         department2     class1  74      1
 215         department2     class1  82      2
 212         department2     class1  83      3
 211         department2     class1  93      4
 213         department2     class1  94      5
 214         department2     class1  94      6
 223         department2     class2  74      1
 222         department2     class2  78      2
 224         department2     class2  80      3
 225         department2     class2  85      4
 221         department2     class2  99      5
 ​
 结果解释:
     同一分区,相同值,不同序。如studentid=213 studentid=214 值都为94 排序为5,6。

 

 

 

 

 

e、percent_rank 开窗函数
 -- percent_rank 开窗函数
 ​
 select studentid,departmentid,classid,math,
 row_number() over(partition by departmentid,classid order by math) as row_number,
 percent_rank() over(partition by departmentid,classid order by math) as percent_rank
 from student_scores;
 ​
 结果
 studentid   departmentid    classid math    row_number  percent_rank
 111         department1     class1  69      1           0.0
 113         department1     class1  74      2           0.25
 112         department1     class1  80      3           0.5
 115         department1     class1  93      4           0.75
 114         department1     class1  94      5           1.0
 124         department1     class2  70      1           0.0
 121         department1     class2  74      2           0.3333333333333333
 123         department1     class2  78      3           0.6666666666666666
 122         department1     class2  86      4           1.0
 216         department2     class1  74      1           0.0
 215         department2     class1  82      2           0.2
 212         department2     class1  83      3           0.4
 211         department2     class1  93      4           0.6
 213         department2     class1  94      5           0.8
 214         department2     class1  94      6           0.8
 223         department2     class2  74      1           0.0
 222         department2     class2  78      2           0.25
 224         department2     class2  80      3           0.5
 225         department2     class2  85      4           0.75
 221         department2     class2  99      5           1.0
 ​
 结果解释:
     studentid=115,percent_rank=(4-1)/(5-1)=0.75
     studentid=123,percent_rank=(3-1)/(4-1)=0.6666666666666666

 

 

(END)

标签:窗口,函数,department1,Hive,department2,69,class2,math,class1
From: https://www.cnblogs.com/houhuilinblogs/p/17986965

相关文章

  • 函数--递归调用
    1.怎么写出一个递归函数step1,写好公式公式是怎么得出的?一般来说通过数学上的归纳演绎、总结得出,具体看下面的例子。step2,一定要写结束条件这一步比较简单,还是得到公式比较关键。2.走楼梯Description假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?为......
  • 《Hive编程指南》读书笔记
    前言:最近刚接触写HiveSQL,却发现许多查询的执行速度远不如预期。为了提升查询效率,我去阅读了《Hive编程指南》,希望通过理解其底层机制来找到优化的方式,并为未来能编写出高效的SQL奠定基础。谨以此文做个记录。一、Hive因何而生先有Hadoop再有HiveHadoop实现了一个计算模型——......
  • dremio random 函数造成dremio crash 问题
    以前没注意使用random,在看社区问题的时候测试了下发现的确有类似的问题,官方的解决方法是通过配置禁用gandiva优化参考配置支持key格式 exec.disabled.gandiva-functions:<function>;<function>参考配置参考禁用处理sabot/kernel/src/main/java......
  • STM32CubeMX教程24 WDG - 独立窗口看门狗
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手逻辑分析仪nanoDLA2、实验目标使用STM32CubeMX软件配置STM32F407开发板的独立看门狗(IWDG)和窗口看门狗(WWDG)并了......
  • Permission denied: user=hive, access=EXECUTE, inode=“/tmp“:root:supergroup:drw
    在执行Hadoop的创建目录、写数据等情况,可能会出现该异常,而在读文件的时候却不会报错,这主要是由于系统的用户名不同导致的,由于我们进行实际开发的时候都是用Windows操作系统,而编译后的JAVA程序是部署在Linux上的。而Windows的用户名一般都是自定义的或者是administrator,Linux的用户......
  • python之内置函数
    内置函数                    1.absdefabs(*args,**kwargs):#realsignatureunknown"""Returntheabsolutevalueoftheargument."""pass翻译:返回参数的绝对值1#!/usr/bin/python2print(abs(-2))#绝对值View......
  • LPC和C对比(2) 函数
    目录函数默认值可变参数库函数efun模拟库函数sefun局部函数lfun系统方法apply简单示例环境(environment)和内容物(inventory)相关函数this_object()environment()all_inventory()deep_inventory()first_inventory()next_inventory()move_object()函数默认值2023.12之后添加的新......
  • 常用的两种UTF8中文截取函数
    /**截取UTF8编码字符串从首字节开始指定宽度(非长度),适用于字符串长度有限的如新闻标题的等宽度截取中英文混排情况较理想.全中文与全英文截取后对比显示宽度差异最大,且截取宽度远大越明显.@paramstring$str UTF-8encoding@paramint[option]$width截取宽度@paramstring[......
  • 【C++入门到精通】C++入门 —— 深浅拷贝函数
     目录拷贝函数浅拷贝拷贝构造函数深拷贝拷贝构造函数总结 前言Linux专栏链接)大家可以关注一下,后面我会一点一点的更新的。大家坐稳扶好,要开车了!!!拷贝函数拷贝构造详细介绍)        是C++中的一个特殊成员函数,用于创建对象的副本。它的作用是通过使用已有对象的属性值来初始......
  • 【C++入门到精通】C++入门 —— 深浅拷贝函数
     目录拷贝函数浅拷贝拷贝构造函数深拷贝拷贝构造函数总结 前言Linux专栏链接)大家可以关注一下,后面我会一点一点的更新的。大家坐稳扶好,要开车了!!!拷贝函数拷贝构造详细介绍)        是C++中的一个特殊成员函数,用于创建对象的副本。它的作用是通过使用已有对象的属性值来初始......