hive 常见函数 窗口函数 聚合函数 map相关函数 实例

一 常见函数

(1)基础函数

1.coalesce (expr1, expr2, …):遇到非null值返回,如果没有非null值出现返回null

2.nvl(expr1, expr2)/ifnull(expr1, expr2):如果expr1为null,则返回expr2,否则返回expr1

(2)字符串相关

1.concat(Str1,Str2,Str3,...) :拼接字符串;Str1||Str2||...(效果一样)

2.concat_ws(B,'&&&'):表示连接时指定分隔符

3.regexp_replace(Array,'¥','$'):在集合或字符串中找符合条件的替代成新字符

特殊符合 加 \\  regexp_replace(str,'\\[|\\]','')

4.split(Str1,'%'):据指定字符切分字符串

5.instr(Str1,Str2,start,end): 查找Str2在Str1的位置,指定开始和结束位置,返回位置int

6.substr(Str,start,end):截取字符串。指定开始位置和长度,索引从1开始

7. upper(Str)/ ucase(Str) : 转大写

8. lower(Str)/ lcase(Str) : 转小写

9.trim(Str)  :去空格

10.regexp '条件1|条件2':符合条件1或者条件2的

(3)时间函数

1.datediff(day1,day2):计算day1和day2间的日期间隔,返回间隔时间int

2.current_date():返回当前日期

3.unix_timestamp(day,日期格式):据特定的日期格式转成时间戳

4.from_unixtime(timestamp,日期格式):将时间戳转成特定的日期格式

datediff(current_date(),from_unixtime(unix_timestamp(date,'yyyymmdd'),'yyyy-mm-dd'))

5.date_add(day,增加天数):日期增加N天 date_add(current_date(),-3)

(4) json相关函数

1.get_json_object(json, '$.key'):解析json的字符串,返回path指定的内容get_json_object('{"name":"zhangsan","age":18}','$.name')

2. json_tuple(json,k1,k2...):解析json字符串,可指定多个json数据中的key,返回对应的value

不需要加$.了

select b.name,b.age from tableName a lateral view json_tuple('{"name":"zhangsan","age":18}','name','age') b as name,age

原链接参考:

Hive解析Json数组超全讲解_yuan_more的博客-CSDN博客_hive解析json数组

二  窗口函数

分析函数(如:sum(),max(),row_number()...) + 窗口子句(over函数)

1.row_number() over():分区排序,同个字段值,随机顺序排序

2 rank() over():分区排序,同个字段值,排名相同,会在名次中留下空位
3 dense_rank()  over():分区排序,同个字段值,排名相同,会在名次中不留下空位

row_number() over(partition by ccid order by  dt desc )

4 sum() over(数据源):指定行范围分区排序

数据源  例如:

1)sum(pv) over(partition by 分区字段 order by 排序字段) as pv1, -- 默认为从起点到当前行
2)sum(pv) over(partition by 分区字段 order by 排序字段 rows between unbounded preceding and current row) as pv2, --从起点到当前行,结果同pv1 
3)sum(pv) over(partition by 分区字段 order by 排序字段 rows between 3 preceding and current row) as pv3,   --当前行+往前3行
4)sum(pv) over(partition by 分区字段 order by 排序字段 rows between 3 preceding and 1 following) as pv4,    --当前行+往前3行+往后1行
5)sum(pv) over(partition by 分区字段 order by 排序字段 rows between current row and unbounded following) as pv5   ---当前行+往后所有行  

关键是理解 
rows between 含义,也叫做window子句:
preceding:往前
following:往后
current row:当前行
unbounded:无边界,unbounded preceding 表示从最前面的起点开始, unbounded following:表示到最后面的终点
–其他avg,min,max,和sum用法一样

5 ntile(n):用于将分组数据按照顺序切分成n片,返回当前切片值

ntile(2) over(partition by 分区字段 order by 排序字段) as ntile1,    --分组内将数据分成2片

6 lag(col,n,default) 用于统计窗口内往上第n行值 --数据源

第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为null时候,取默认值,如不指定,则为null)

lag(createtime,1,'1970-01-01') over(partition by 分区字段order by 排序字段)

7 lead(col,n,default) :与 lag 相反,用于统计窗口内往下第n行值

 原链接参考:Hive开窗函数总结_Abysscarry的博客-CSDN博客_hive的开窗函数

三  聚合函数(UDTFUDAF等

1.str_to_map(Str,'k-v间间隔符','k和v间间隔符'):将字符类型转成map类型

经常使用 例如:

str_to_map(concat_ws('&&&',collect_set(concat(k,':',v))),'&&&',':')

concat(k,':',v):拼接k-v字符串:如 k1:v1

2.collect_set(A):列转行,将多个k-v 收集 k1:v1 k2:v2 k3:v3(多对一

concat_ws(B,'&&&'):表示连接时指定分隔符 k1:v1&&&k2:v2&&&k3:v3

3.str_to_map(C,'&&&',':'): 将字符类型转成map类型{k1:v1,k2:v2,k3:v3}

4.explode:explode就是将hive一行中复杂的array或者map结构拆分成多行(一对多

经常使用 例如:

explode(split(regexp_replace(Array,'$$'),'%'),'&'))

explode(array('A','B','C')) ; explode(map('A',10,'B',20,'C',30))

regexp_replace:符合替代字符串

split(A,'%'):据指定字符切分字符串

explode(A):拆分成多行

8.lateral view:用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。

经常使用 例如:

lateral view explode(split(regexp_replace(Array,'¥','$'),'&')) 视图名 AS 列名

由此可见,lateral view与explode等udtf就是天生好搭档,explode将复杂结构一行拆成多行,然后再用lateral view做各种聚合。

四 map相关函数

map的具体k-v,例如:{k1:v1,k2:v2,k3:v3}

1、size(Map)函数:可得map的长度 

2. map_keys(Map)函数:可得map中所有的key;  返回值类型: array

3.map_values(Map)函数:可得map中所有的value; 返回值类型: array

4.array_contains(map_keys(Map),'k1'):判断map中是否包含某个key值

5.split(Map['k1'],',')[1]:

 在k-v对中,若value有多个值的情况,如 {'k1':'01,02,03'} ,要用 'k1' 中 '02'作为过滤条件

6.substr(Map['k2'],1,2) = '45':k2的值必须为'45'开头

五 动态分区(随机分区,减少数据倾斜)

insert overwrite table xx partition (id_hash)

select id,int(rand()*100) asid_hash

from xx.xx

distribute by int(rand()*100);

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值