Hive常用函数

https://www.iteblog.com/archives/2258.html#3_lt

if

if判断

select if(1=1,“yes”,“no!”); //返回yes

case

语法 :
case [expression]
	when condition1   then   result1 
 	when condition2  then   result2
	else  result 
end 

例子 : 
case a 
	when 1 then "one"
    when 2 then "two"
    else "other"
end
    

concat , concat_ws

连接字符串

concat(string A, string B…) 连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串

concat_ws(string SEP, string A, string B…) 连接多个字符串,字符串之间以指定的分隔符分开。

collect_set , collect

返回无重复记录,返回的是一个数组 , 可以实现列转行(配合concat)

nvl

空值转换函数

nvl(expr1,expr2)将查询的null值转换为指定值

如果expr1为null , 则返回expr2 , 否则返回expr1

coalesce

和nvl类似(都是处理null值的方法) , 返回第一个非null的值

select coalesce(null,2,3,4); //返回2

explode

将数组/集合转换为单独的多行

select split("a,b,c,d",",");
OK
["a","b","c","d"]]

select explode(split("a,b,c,d",","));
OK
a
b
c
d

lateral view

概念

lateral view 其实就是用来实现类似explode这种UDTF函数联合使用的

lateral view会将UDTF生成的结果放到一个虚拟表中 , 然后这个虚拟表会和输入行的主键来进行join来达到UDTF外的select字段的目的

语法

lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (‘,’ columnAlias)*
fromClause: FROM baseTable (lateralView)*

可以在两个地方用lateral view : 在udtf前面使用 , 在from base table 后面使用

实例
select reneger,reason,test_id
from a lateral view  explode(split("1,2,3",","))  temp as test_id;

lateral view 与 explode等udtf就是天生好搭档 , explode将复杂结构的一行拆成多行 , 再用lateral view 做聚合

Lateral View通常和UDTF一起出现,为了解决UDTF不允许再select字段的问题。
Multiple Lateral View可以实现类似笛卡尔乘积。
Outer关键字可以把不输出的UDTF的空结果,输出成NULL,防止丢失数据。

instr

instr(string str , string substr )

查找字符串str中子字符串substr出现的位置 , 如果查找失败返回0 , 如果任意一个参数为null , 将返回null , 位置从1开始

select instr("nihao","hao");
OK
3

select instr("nihao","hao22");
OK
0

row_number , rank , dense_rank

转自https://www.cnblogs.com/wujin/p/6051768.html

都是实现分组排序的方法

语法 : ROW_NUMBER() OVER (partition BY COLUMN_A ORDER BY COLUMN_B ASC/DESC) rn

row_number可以替换为rank , dense_rank

数据
id name sal
1   a   10
2   a   12
3   b   13
4   b   12
5   a   14
6   a   15
7   a   13
8   b   11
9   a   16
10  b   17
11  a   14

语句
select id,
name,
sal,
rank()over(partition by name order by sal desc ) rp,
dense_rank() over(partition by name order by sal desc ) drp,
row_number()over(partition by name order by sal desc) rmp
from f_test

结果
10   b    17    1    1    1
3    b    13    2    2    2
4    b    12    3    3    3
8    b    11    4    4    4
9    a    16    1    1    1
6    a    15    2    2    2
11   a    14    3    3    3
5    a    14    3    3    4
7    a    13    5    4    5
2    a    12    6    5    6
1    a    10    7    6    7

ank() 排序相同时会重复,总数不会变

dense_rank()排序相同时会重复,总数会减少

row_number() 会根据顺序计算

ntile

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

select * from (
    select id,
        name,
        sal,
        NTILE(2) over(partition by name order by sal desc ) rn
    from f_test
) t where t.rn=1

烦1!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值