HiveQL/SparQL 常用函数


HiveQL/SparQL 常用函数一、窗口函数1.1 基础结构1.2 row_number/rank/dense_rank:排序函数1.3 sum/avg/max/min:聚合函数1.4 lag/lead/first_value/last_value:取上下行函数1.5 ntile:分析函数,用于百分点、n分片等1.6 count over二、数组类型的函数2.1 array:生成数组格式2.2 collect_list/collect_set:分组中某列转为数组返回2.3 array_contains:判断数组是否包含某个元素2.4 split:字符串切分为数组三、正则表达式函数3.1 like:判断是否匹配3.2 regexp/rlike:正则判断是否3.3 regexp_extract:正则匹配3.4 regexp_replace:正则代替3.5 常用匹配四、字符串函数4.1 concat:字符串拼接4.2 concat_ws:列表格式拼接4.3 instr:字符串查找4.4 substr:字符串截取五、时间处理函数5.1 from_unixtime/unix_timestamp:时间戳转换5.2 pdate2date/date2pdate:日期格式转换5.3 date_sub/add_months:返回前n天/月的日期5.4 datediff:计算日期差5.5 trunc:返回当月第一天/返回双月第一天六、行转列6.1 explode:单字段行转列6.2 lateral view explode:行转列6.3 lateral view posexplode:行转列,带顺序七、分位数函数7.1 percentile & percentile_approx八、json函数8.1 get_json_object:获取json对象的value8.2 json_tuple:一次获取多个对象的value九、其他 9.1 greatest:多列最大值9.2 rand:随机函数9.3 max_pt:读取表中最大分区9.4 coalesce/nvl:返回第一个非空值十、参考

一、窗口函数

1.1 基础结构

窗口函数 = 分析函数 + over函数

分析函数:sum ( )、max ( )、row_number ( ) 等等

over函数:over (partition by user_id order by date desc/asc)

按照user_id字段分区,每个分区内根据date字段排序,asc:升序(默认升序) desc:降序

 

1.2 row_number/rank/dense_rank:排序函数

a)row_number ( ) over ( ):依次排序且不会并列重复

b)rank ( ) over ( ):排序相等会在名次中留下空位

c)dense_rank ( ) over ( ):排序相等不会在名次中留下空位

 

user_iddaterow_numberrankdense_rank
1234520190101111
1234520190101211
1234520190102332

1.3 sum/avg/max/min:聚合函数

user_iddatesalarysumavgmaxmin
12345201901100100100100100
12345201902200300150200100
12345201903300600200300100
user_iddatesalarysumavgmaxmin
12345201901100600200300100
12345201902200600200300100
12345201903300600200300100

1.4 lag/lead/first_value/last_value:取上下行函数

user_iddatelagleadfirst_valuefirst_value_desc
1234520190101""201901022019010120190103
123452019010220190101201901032019010120190103
123452019010320190102NULL2019010120190103
user_iddatelast_valuelast_value2
12345201901012019010120190103
12345201901022019010220190102
12345201901032019010320190101

1.5 ntile:分析函数,用于百分点、n分片等

NTILE()把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。

NTILE()函数将排序分区中的行划分为特定数量的组。从每个组分配一个从一开始的桶号。对于每一行,NTILE()函数返回一个桶号,表示行所属的组。

  • n是一个字面正整数。桶号的范围是1到n
  • PARTITION BY从返回的结果集划分FROM子句为分区到的NTILE()函数被应用。
  • ORDER BY子句指定将NTILE()值分配给分区中的行的顺序。

然后可以根据桶号,选取前或后n分之几的数据。

用户收入表:user_salary

user_idsalary
1100
2200
3300
user_idsalaryrn
11001
22001
33002

1.6 count over

namedepartmentsalarycn1cn2cn3
王五人事4000111
刘二研发6500341
赵六研发7000342
陈一研发6500343
张三财务5000261
李四财务5200262

二、数组类型的函数

2.1 array:生成数组格式

array (val1, val2, val3, …):将多个数据生成数组格式

array类型的数据可以通过'数组名[index]'的方式访问,index从0开始:

2.2 collect_list/collect_set:分组中某列转为数组返回

将分组中某列转为一个数组返回,不同的是collect_list不去重而collect_set去重

collect_set的参数必须是string类型

user_iddate
123451001
123451001
123451002
函数collect_listcollect_set
user_iddatedate
123451001,1001,10021001,1002

2.3 array_contains:判断数组是否包含某个元素

判断数组是否包含某个元素,返回true/false

2.4 split:字符串切分为数组

将字符串切分为数组

三、正则表达式函数

3.1 like:判断是否匹配

主要用在where子句中,用来筛选内容,%是通配符,返回true/false

3.2 regexp/rlike:正则判断是否

主要用在where子句中,用来筛选内容,返回true/false

3.3 regexp_extract:正则匹配

用来从内容中匹配指定样式的内容缺点是不能提取满足条件的所有内容

regexp_extract ( date, pattern, index )

3.4 regexp_replace:正则代替

用在select 子句中,用来将目标内容的特定部分替换成指定的内容

3.5 常用匹配

 

四、字符串函数

4.1 concat:字符串拼接

4.2 concat_ws:列表格式拼接

4.3 instr:字符串查找

instr(str1, str2, start_index, nth_appearance):返回查找到的位置,未找到返回为0

4.4 substr:字符串截取

substr(string str1, int start, int len):返回字符串str1从start位置开始,长度为len的字符串;len不传,默认从start位置到结尾的字符串

五、时间处理函数

5.1 from_unixtime/unix_timestamp:时间戳转换

from_unixtime(ts, date_fomat):时间戳转换为日期格式

unix_timestamp(date_fomat, ts):日期格式转换为时间戳

5.2 pdate2date/date2pdate:日期格式转换

5.3 date_sub/add_months:返回前n天/月的日期

date_sub ('${DATE}', n):返回DATE的前n天的日期,n:正数是减,负数是加

add_months('${DATE}', n):返回DATE的后n月的日期,n:正数是加,负数是减

5.4 datediff:计算日期差

datediff (end_date, start_date) 求两个指定日期的差,end_date - start_date

end_date/start_date的日期格式必须是'yyyy-MM-dd'格式

5.5 trunc:返回当月第一天/返回双月第一天

trunc('${DATE}', 'MM')

 

六、行转列

6.1 explode:单字段行转列

explode(array):将一行数组转成多列,只支持单个字段的行转列

num
0
1
2

6.2 lateral view explode:行转列

lateral view explode(array(0,1,2)):将某列字段切分成多列,其他字段均不变

user_idvid2
1111201
1111202
1111203
1111204

6.3 lateral view posexplode:行转列,带顺序

场景1:行转列,并带上每个元素在数组中的顺序

rule_idprod_list
1111203, 1202, 1201,1204
rule_idproduct_idrnk
11112030
11112021
11112012
11112043

场景2:两行同时行转列,并按数组中相同的顺序放置为1行

rule_idprod_listgmv_list
1111203, 1202, 1201,1204300,200,100,400
rule_idproduct_idgmv
1111203300
1111202200
1111201100
1111204400

七、分位数函数

7.1 percentile & percentile_approx

percentile(col, pth):求准确的第pth个百分位数

percentile_approx(col, pth, acc):求近似的第pth个百分位数,acc默认10000(万分之一)

八、json函数

8.1 get_json_object:获取json对象的value

get_json_object (json_str, '$.key1')

8.2 json_tuple:一次获取多个对象的value

json_tuple(json_str, key1, key2, ...)

sku_idstock_num
71250
sku_idstock_num
71250
712610

九、其他

9.1 greatest:多列最大值

greatest (col1, col2, ...):求多列的最大值

9.2 rand:随机函数

9.3 max_pt:读取表中最大分区

max_pt('库名.表名', '分区名', '分区格式'):返回表中最大分区

9.4 coalesce/nvl:返回第一个非空值

十、参考

Hive on Spark解析

sum/avg/max/min解析

lag/lead/first_value/last_value解析

ntile分析函数

Hive函数大全