Spark分析窗口函数

Spark1.4发布,支持了窗口分析函数(window functions)。
在离线平台中,90%以上的离线分析任务都是使用Hive实现,其中必然会使用很多窗口分析函数,如果SparkSQL支持窗口分析函数,

那么对于后面Hive向SparkSQL中的迁移的工作量会大大降低,使用方式如下:


1、初始化数据

创建表

[sql]  view plain  copy
  1. create table window_test2 (url string, rate int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';  


准备测试数据
[plain]  view plain  copy
  1. url1,12  
  2. url2,11  
  3. url1,23  
  4. url2,25  
  5. url1,58  
  6. url3,11  
  7. url2,25  
  8. url3,58  
  9. url2,11  

加载数据:

[sql]  view plain  copy
  1. load  data local  inpath  '/opt/bin/short_opt/windows2.data' overwrite into table window_test2 ;  



2、窗口函数测试

查询所有数据

[sql]  view plain  copy
  1. select * from window_test2;  
+-------+-------+
|  url  | rate  |
+-------+-------+
| url1  | 12    |
| url2  | 11    |
| url1  | 23    |
| url2  | 25    |
| url1  | 58    |
| url3  | 11    |
| url2  | 25    |
| url3  | 58    |
| url2  | 11    |
+-------+-------+


分组排序:
[sql]  view plain  copy
  1. select url,rate,row_number() over(partition by url order by rate descas r from window_test2;  
+-------+-------+----+
|  url  | rate  | r  |
+-------+-------+----+
| url1  | 58    | 1  |
| url1  | 23    | 2  |
| url1  | 12    | 3  |
| url2  | 25    | 1  |
| url2  | 25    | 2  |
| url2  | 11    | 3  |
| url2  | 11    | 4  |
| url3  | 58    | 1  |
| url3  | 11    | 2  |
+-------+-------+----+


分组统计sum
[sql]  view plain  copy
  1. select url,rate,sum(rate) over(partition by url ) as r from window_test2;  
+-------+-------+-----+
|  url  | rate  |  r  |
+-------+-------+-----+
| url1  | 12    | 93  |
| url1  | 23    | 93  |
| url1  | 58    | 93  |
| url2  | 11    | 72  |
| url2  | 25    | 72  |
| url2  | 25    | 72  |
| url2  | 11    | 72  |
| url3  | 11    | 69  |
| url3  | 58    | 69  |
+-------+-------+-----+



分组统计avg
[sql]  view plain  copy
  1. select url,rate,avg(rate) over(partition by url ) as r from window_test2;  
+-------+-------+-------+
|  url  | rate  |   r   |
+-------+-------+-------+
| url1  | 12    | 31.0  |
| url1  | 23    | 31.0  |
| url1  | 58    | 31.0  |
| url2  | 25    | 18.0  |
| url2  | 11    | 18.0  |
| url2  | 11    | 18.0  |
| url2  | 25    | 18.0  |
| url3  | 11    | 34.5  |
| url3  | 58    | 34.5  |
+-------+-------+-------+


分组统计count
[sql]  view plain  copy
  1. select url,rate,count(rate) over(partition by url ) as r from window_test2;  
+-------+-------+----+
|  url  | rate  | r  |
+-------+-------+----+
| url1  | 12    | 3  |
| url1  | 23    | 3  |
| url1  | 58    | 3  |
| url2  | 11    | 4  |
| url2  | 25    | 4  |
| url2  | 25    | 4  |
| url2  | 11    | 4  |
| url3  | 11    | 2  |
| url3  | 58    | 2  |
+-------+-------+----+



分组lag
[sql]  view plain  copy
  1. select url,rate,lag(rate) over(partition by url ) as r from window_test2;  
+-------+-------+-------+
|  url  | rate  |   r   |
+-------+-------+-------+
| url1  | 12    | NULL  |
| url1  | 23    | 12    |
| url1  | 58    | 23    |
| url2  | 25    | NULL  |
| url2  | 11    | 25    |
| url2  | 11    | 11    |
| url2  | 25    | 11    |
| url3  | 11    | NULL  |
| url3  | 58    | 11    |
+-------+-------+-------+



3、spark-1.4以后,支持所有的窗口函数了,有利用于hive作业向spark-sql来转换。
Spark SQL的窗口函数是一种用于对数据进行分组和排序的函数。它可以在查询结果中创建一个窗口,然后在窗口内进行聚合、排序和分析操作。窗口函数的语法结构如下所示: <窗口函数>(参数) OVER ( [PARTITION BY <列清单>] [ORDER BY <排序用清单列>] [ASC/DESC] (ROWS | RANGE) <范围条件> ) 其中,关键字OVER表示这是一个窗口函数,不是普通的聚合函数。PARTITION BY子句用于指定分组字段,ORDER BY子句用于指定排序字段。ROWS/RANGE窗口子句用于控制窗口的尺寸边界,有两种选项:ROW表示物理窗口,数据筛选基于排序后的索引;RANGE表示逻辑窗口,数据筛选基于。[1] 在Spark SQL中,窗口函数可以通过使用Column提供的over函数来实现。下面是一个示例代码,展示了如何使用窗口函数进行累加历史和全部统计: ```scala import org.apache.spark.sql.expressions._ val first_2_now_window = Window.partitionBy("pcode").orderBy("event_date") df_userlogs_date.select( $"pcode", $"event_date", sum($"duration").over(first_2_now_window).as("sum_duration") ).show ``` 以上代码使用了窗口函数sum来计算每个pcode和event_date的duration的累加,并将结果命名为sum_duration。通过使用over函数和指定的窗口(first_2_now_window),我们可以在每个窗口内进行累加计算。最后,使用show方法展示结果。[3] 总结来说,Spark SQL的窗口函数是一种强大的工具,可以在查询结果中创建窗口,并在窗口内进行聚合、排序和分析操作。它可以通过使用Column提供的over函数来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值