spark2.3 SQL内置函数——Date window functions

1. def cume_dist(): Column

–CUME_DIST 小于等于当前值的行数/分组内总行数
–比如,统计小于等于当前薪水的人数,所占总人数的比例

d1,user1,1000
d1,user2,2000
d1,user3,3000
d2,user4,4000
d2,user5,5000

df.withColumn("rn1",cume_dist().over(Window.partitionBy(col("dept")).orderBy(col("sal")))).show()

dept    userid   sal       rn2
-------------------------------------------
d1      user1   1000      0.3333333333333333
d1      user2   2000      0.6666666666666666
d1      user3   3000      1.0
d2      user4   4000      0.5
d2      user5   5000      1.0

rn1: 按照部门分组,dpet=d1的行数为3,
     第二行:小于等于2000的行数为2,因此,2/3=0.6666666666666666

2.def percent_rank(): Column

–PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
应用场景不了解,可能在一些特殊算法的实现中可以用到吧。

d1,user1,1000
d1,user2,2000
d1,user3,3000
d2,user4,4000
d2,user5,5000

df.withColumn("rn1",percent_rank().over(Window.partitionBy(col("dept")).orderBy(col("sal")))).show()

dept    userid   sal      rn2
-----------------------------
d1      user1   1000    0.0
d1      user2   2000    0.5
d1      user3   3000    1.0
d2      user4   4000    0.0
d2      user5   5000    1.0

3.def ntile(n: Int): Column

NTILE(n),用于将分组数据按照顺序切分成n片,返回当前切片值
NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
如果切片不均匀,默认增加第一个切片的分布

cookie1 2015-04-10      1
cookie1 2015-04-11      5
cookie1 2015-04-12      7
cookie1 2015-04-13      3
cookie1 2015-04-14      2
cookie1 2015-04-15      4
cookie1 2015-04-16      4
cookie2 2015-04-10      2
cookie2 2015-04-11      3
cookie2 2015-04-12      5
cookie2 2015-04-13      6
cookie2 2015-04-14      3
cookie2 2015-04-15      9
cookie2 2015-04-16      7

df.withColumn("rn3",ntile(3).over(Window.partitionBy(col("cookieid")).orderBy(col("createtime")))).show()

比如,统计一个cookie,pv数最多的前1/3的天

--rn = 1 的记录,就是我们想要的结果

cookieid day           pv       rn
----------------------------------
cookie1 2015-04-12      7       1
cookie1 2015-04-11      5       1
cookie1 2015-04-15      4       1
cookie1 2015-04-16      4       2
cookie1 2015-04-13      3       2
cookie1 2015-04-14      2       3
cookie1 2015-04-10      1       3
cookie2 2015-04-15      9       1
cookie2 2015-04-16      7       1
cookie2 2015-04-13      6       1
cookie2 2015-04-12      5       2
cookie2 2015-04-14      3       2
cookie2 2015-04-11      3       3
cookie2 2015-04-10      2       3

4. def row_number(): Column

ROW_NUMBER() –从1开始,按照顺序,生成分组内记录的序列

row_number(): 不考虑数据的重复性 按照顺序一次打上标号 : 如: 1,2,3,4

–比如,按照pv降序排列,生成分组内每天的pv名次
ROW_NUMBER() 的应用场景非常多,再比如,获取分组内排序第一的记录;获取一个session中的第一条refer等。

cookie1 2015-04-10      1
cookie1 2015-04-11      5
cookie1 2015-04-12      7
cookie1 2015-04-13      3
cookie1 2015-04-14      2
cookie1 2015-04-15      4
cookie1 2015-04-16      4
cookie2 2015-04-10      2
cookie2 2015-04-11      3
cookie2 2015-04-12      5
cookie2 2015-04-13      6
cookie2 2015-04-14      3
cookie2 2015-04-15      9
cookie2 2015-04-16      7

df.withColumn("rn3",ROW_NUMBER().over(Window.partitionBy(col("cookieid")).orderBy(col("pv").desc))).show()

cookieid day           pv       rn
-------------------------------------------
cookie1 2015-04-12      7       1
cookie1 2015-04-11      5       2
cookie1 2015-04-15      4       3
cookie1 2015-04-16      4       4
cookie1 2015-04-13      3       5
cookie1 2015-04-14      2       6
cookie1 2015-04-10      1       7
cookie2 2015-04-15      9       1
cookie2 2015-04-16      7       2
cookie2 2015-04-13      6       3
cookie2 2015-04-12      5       4
cookie2 2015-04-14      3       5
cookie2 2015-04-11      3       6
cookie2 2015-04-10      2       7

5. def rank(): Column

—RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位

rank() :考虑数据的重复性,挤占坑位,如:1,2,2,4

cookie1 2015-04-10      1
cookie1 2015-04-11      5
cookie1 2015-04-12      7
cookie1 2015-04-13      3
cookie1 2015-04-14      2
cookie1 2015-04-15      4
cookie1 2015-04-16      4
cookie2 2015-04-10      2
cookie2 2015-04-11      3
cookie2 2015-04-12      5
cookie2 2015-04-13      6
cookie2 2015-04-14      3
cookie2 2015-04-15      9
cookie2 2015-04-16      7

df.withColumn("rn3",RANK().over(Window.partitionBy(col("cookieid")).orderBy(col("pv").desc))).show()

cookieid day           pv       rn1
--------------------------------------
cookie1 2015-04-12      7       1
cookie1 2015-04-11      5       2
cookie1 2015-04-15      4       3
cookie1 2015-04-16      4       3
cookie1 2015-04-13      3       5
cookie1 2015-04-14      2       6
cookie1 2015-04-10      1       7    

rn1: 15号和16号并列第3, 13号排第5
6. def dense_rank() : Column

DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位

dense_rank() : 考虑数据重复性 不挤占坑位,如:1,2,2,3

cookie1 2015-04-10      1
cookie1 2015-04-11      5
cookie1 2015-04-12      7
cookie1 2015-04-13      3
cookie1 2015-04-14      2
cookie1 2015-04-15      4
cookie1 2015-04-16      4
cookie2 2015-04-10      2
cookie2 2015-04-11      3
cookie2 2015-04-12      5
cookie2 2015-04-13      6
cookie2 2015-04-14      3
cookie2 2015-04-15      9
cookie2 2015-04-16      7

df.withColumn("rn1",DENSE_RANK().over(Window.partitionBy(col("cookieid")).orderBy(col("pv").desc))).show()

cookieid day           pv           rn1
--------------------------------------------
cookie1 2015-04-12      7        1
cookie1 2015-04-11      5        2
cookie1 2015-04-15      4        3
cookie1 2015-04-16      4        3
cookie1 2015-04-13      3        4
cookie1 2015-04-14      2        5
cookie1 2015-04-10      1        6   

rn2: 15号和16号并列第3, 13号排第4

原文地址:https://www.cnblogs.com/yyy-blog/p/12642840.html

时间: 2024-08-03 23:42:40

spark2.3 SQL内置函数——Date window functions的相关文章

sql内置函数pivot强大的行转列功能

原文:sql内置函数pivot强大的行转列功能 语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 200

Spark SQL内置函数

Spark SQL内置函数官网API:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions%24 平常在使用mysql的时候,我们在写SQL的时候会使用到MySQL为我们提供的一些内置函数,如数值函数:求绝对值abs().平方根sqrt()等,还有其它的字符函数.日期函数.聚合函数等等.使我们利用这些内置函数能够快速实现我们的业务逻辑.在SparkSQL里其实也为我们提供了近

SQL内置函数细讲

一.伪表.系统内置的只有一行一列数据的表.常用来执行函数. select 函数名 from dual 注:以下所有函数为了方便理解均用 伪表 做为事例! 二. 时间函数 1.sysdate:获取数据库系统的当前时间 例:select sysdate from dual 我们就会获取到当前系统的时间 2.add_months:对日期的月份进行加减 select add_months(日期, 数值) from dual 在这里的数值是必须要写的,如果不想对日期进行加减我们可以把数值写成0! 例:se

Oracle SQL 内置函数大全(转)

SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A         A      ZERO     SPACE--------- --------- --------- ---------65        97        48        32 2.CHR 给出整数,返回对应的字符;SQL> selec

SQL内置函数

一.字符型函数(只是记录一些容易忘记的基本函数) 1.大小写转换函数 INITCAP:将字符串中每一个单词的第一个字母转换为大写,其他均为小写 SELECT INITCAP(column) FROM DUAL2.字符串处理函数 INSTR:从一个字符串中查找一个给定字符的数字位置 SELECT INSTR(String,'K') FROM DUAL LPAD:用给定的字符从左填充字符串到给定的长度 RPAD:用给定的字符从又填充字符串到给定的长度 3.字符串替代函数 REPLACE(string

VBScript 内置函数

内置函数 Date/ Time 函数 [Date:] CDate 作用: 把有效的日期和时间表达式转换为日期(Date)类型. 用法: retDate = CDate(date) 输入: date: 为一个时间表达式的字符串等 输出(返回值): 返回日期或时间的字符串 Date 作用: 返回当前的系统日期. 用法: date = Date() IsDate 作用: 返回指示计算表达式能否转换为日期的布尔值. 用法: IsDate(dateString) 输入: dateString 为将要检测的

1.3.2 常用内置函数

常用内置函数(Built-In Functions,BIF)不需要导入任何模块即可直接使用,在IDLE中执行如下命令可以列出所有内置函数和内置对象,如代码块1.3.2.1所示: 1 >>> dir(__builtins__) 2 ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'Byte

python 内置函数和匿名函数

内置函数 截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.     Built-in Functions     abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() o

SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

原文:SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页) SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅途(www.Zuowenjun.cn) --CreateDate:2015-06-02 --Function:分页获取数据 /******************/ crea