Hive 常用函数总结
- 数学函数
- 日期函数
- 条件函数
- 字符串函数
- 聚合函数
- 表生成函数
- 行列转换
- 窗口函数
- 进阶函数
数学函数
round(double d, int n):返回保留n位小数的近似d值
hive (default)> select round(3.1415,2) round from dual;
3.14
floor(double d): 返回小于d的最大整值
hive (default)> select floor(3.1415) round from dual;
3
ceil(double d): 返回大于d的最小整值
hive (default)> select ceil(3.1415) round from dual;
4
rand(int seed): 返回随机数,seed是随机因子
hive (default)> select rand(10) from dual;
0.7304302967434272
hive (default)> select rand(1) from dual;
0.7308781907032909
hive (default)> select rand(2) from dual;
0.7311469360199058
bin(int d): 计算二进制值d的string值
hive (default)> select bin(8) from dual;
1000
日期函数
to_date(string timestamp):返回时间字符串中的日期部分
hive (default)> select to_date('1970-01-01 00:00:00') from dual;
1970-01-01
date_format 日期格式化函数:格式化日期时候如果第一个参数为字符串,那么只能识别yyyy-MM-dd 类型的数据, : 第一个参数只能是String 类型或者日期类型
hive (default)> desc function date_format;
date_format(date/timestamp/string, fmt) - converts a date/timestamp/string to a value of string in the format specified by the date format fmt.
hive (default)> select date_format(to_date('2021-09-01'),'yyyy-MM') from dual;
2021-09
current_date:返回当前日期
hive (default)> select current_date from dual;
2021-09-05
year(date):返回日期date的年,类型为int如year(‘2019-01-01’)=2019
hive (default)> select year('2021-09-05') from dual;
2021
month(date):返回日期date的月,类型为int,如month(‘2019-01-01’)=1
hive (default)> select month('2021-09-05') from dual;
9
day(date): 返回日期date的天,类型为int,如day(‘2019-01-01’)=1
hive (default)> select day('2021-09-05') from dual;
5
weekofyear(date1):返回日期date1位于该年第几周
hive (default)> select weekofyear('2021-01-04') from dual;
1
datediff(date1,date2):返回日期date1与date2相差的天数
hive (default)> select datediff('2021-09-05','2021-09-01') from dual;
4
date_add(date1,int1):返回日期date1加上int1的日期
hive (default)> select date_add('2021-09-01',3) from dual;
2021-09-04
date_sub(date1,int1):返回日期date1减去int1的日期
hive (default)> select date_sub('2021-09-05',3) from dual;
2021-09-02
months_between(date1,date2):返回date1与date2相差月份
hive (default)> select months_between('2021-05-04','2021-09-04') from dual;
-4.0
add_months(date1,int1):返回date1加上int1个月的日期,int1可为负数
hive (default)> select add_months('2021-05-04',2) from dual;
2021-07-04
last_day(date1):返回date1所在月份最后一天
hive (default)> select last_day('2021-05-04') from dual;
2021-05-31
next_day(date1,day1):返回日期date1的下个星期day1的日期
hive (default)> select next_day('2021-09-04','MO') from dual;
2021-09-06
trunc(date1,string1):返回日期最开始年份或月份。string1可为年(YYYY/YY/YEAR)或月(MONTH/MON/MM)
hive (default)> select trunc('2021-09-02','YYYY') from dual;
2021-01-01
hive (default)> select trunc('2021-09-02','MM') from dual;
2021-09-01
unix_timestamp():返回当前时间的unix时间戳,可指定日期格式
hive (default)> select unix_timestamp('2021-09-01','yyyy-mm-dd') from dual;
1609430940
from_unixtime():返回unix时间戳的日期,可指定格式。如select from_unixtime(unix_timestamp('2019-
03-06','yyyy-mm-dd'),'yyyymmdd')='20190306'
hive (default)> select from_unixtime(unix_timestamp('2021-09-01','yyyy-mm-dd'),'yyyymmdd') from dual;
20210901
条件函数
if(boolean,t1,t2):若布尔值成立,则返回t1,反正返回t2
hive (default)> select if(1>2,100,200) from dual;
200
coalesce(v0,v1,v2):返回参数中的第一个非空值,若所有值均为null,则返回null
hive (default)> select coalesce(null,1,2) from dual;
1
hive (default)> select coalesce(null,null,2) from dual;
2
hive (default)> select coalesce(null,null,null) from dual;
NULL
isnull(a):若a为null则返回true,否则返回false
hive (default)> select isnull(null) from dual;
true
hive (default)> select isnull('word') from dual;
false
字符串函数
length(string1):返回字符串长度
hive (default)> select length('world') from dual;
5
concat(string1,string2):返回拼接string1及string2后的字符串
hive (default)> select concat('hello','world') from dual;
helloworld
concat_ws(sep,string1,string2):返回按指定分隔符拼接的字符串
hive (default)> select concat_ws('-','hello','world') from dual;
hello-world
lower(string1):返回小写字符串,同lcase(string1)。upper()/ucase():返回大写字符串
hive (default)> select lower('Hive') from dual;
hive
trim(string1):去字符串左右空格,ltrim(string1):去字符串左空格。rtrim(string1):去字符串右空格
hive (default)> select trim(' Hello ') from dual;
Hello
repeat(string1,int1):返回重复string1字符串int1次后的字符串
hive (default)> select repeat('hello',3) from dual;
hellohellohello
reverse(string1):返回string1反转后的字符串。如reverse(‘abc’)返回’cba’
hive (default)> select reverse('hello') from dual;
olleh
rpad(string1,len1,pad1):以pad1字符右填充string1字符串,至len1长度。如rpad(‘abc’,5,‘1’)返回’abc11’。lpad():左填充
hive (default)> select rpad('abc',5,'de') from dual;
abcde
select rpad('abc',5,'def') from dual;
hive (default)> select rpad('abc',5,'def') from dual;
abcde
split(string1,pat1):以pat1正则分隔字符串string1,返回数组。如split(‘a,b,c’,’,’)返回[“a”,“b”,“c”]
hive (default)> select split('hello,world,hadoop',',') from dual;
["hello","world","hadoop"]
substr(string1,index1,int1):以index位置起截取int1个字符。如substr(‘abcde’,1,2)返回’ab’
hive (default)> select substr('abcdefg',2,3) from dual;
bcd
egexp_replace 字符串替换函数,将源字符替换成为目标字符
聚合函数
count():统计行数
sum(col1):统计指定列和
avg(col1):统计指定列平均值
min(col1):返回指定列最小值
max(col1):返回指定列最大值
表生成函数
explode (array):返回多行array中对应的元素。explode常用来做行列转换。
hive (default)> select explode(array('A','B','C')) from dual;
OK
col
A
B
C
案例一
hive (default)> select * from advertise;
OK
advertise.pageid advertise.ad_list
front_page ["1","2","3"]
contract_page ["3","4","5"]
hive (default)> SELECT pageid, adid FROM advertise LATERAL VIEW explode(ad_list) adTable AS adid;
OK
pageid adid
front_page 1
front_page 2
front_page 3
contract_page 3
contract_page 4
contract_page 5
SELECT adid, count(1) cnt
FROM advertise LATERAL VIEW explode(ad_list) adTable AS adid
GROUP BY adid;
adid cnt
1 1
2 1
3 2
4 1
5 1
hive (default)> select * from ad_v2;
OK
ad_v2.col1 ad_v2.col2
["1","2"] ["a","b","c"]
["3","4"] ["d","e","f"]
Time taken: 0.057 seconds, Fetched: 2 row(s)
hive (default)> SELECT myCol1, myCol2 FROM ad_v2
> LATERAL VIEW explode(col1) myTable1 AS myCol1
> LATERAL VIEW explode(col2) myTable2 AS myCol2;
OK
mycol1 mycol2
1 a
1 b
1 c
2 a
2 b
2 c
3 d
3 e
3 f
4 d
4 e
4 f
行列转换
https://blog.csdn.net/u010003835/article/details/106632597
Hive 行列转换: https://blog.csdn.net/u010003835/article/details/106604698#comments_17639212
窗口函数
Hive 中的OVER函数解析:https://blog.csdn.net/qq_43081842/article/details/102833424
Hive中的窗口分析函数:https://blog.csdn.net/qq_43081842/article/details/104459384
进阶函数
collect_set():把同一个分组不同行的数据聚合成为一个集合,用下标可以取某一个
对于非group by字段,可以用Hive的collect_set函数收集这些字段,返回一个数组;
select course,collect_set(area),avg(score) from student group by course;
result: chinese ["sh","bj"] 89
math ["bj"] 90
get_json_object (解析json)
get_json_object(param1,"$.param2")
param1:需要被解析的json字段
param2:数组就用 [0,1,2...] 0,1,2是数组对应的元素,遇若jsonObject直接用 ".key"取出想要获取的value。
[{"name":"Tom","sex":"男","age":"22"},{"name":"Jack","sex":"女"age":"32"}]
1、如果需要获取第一个json对象,hive语句如下
SELECT get_json_object(pjson,"$.[0]") FROM person;
得到第一个json对象
{"name":"Tom","sex":"男","age":"22"}
2、如果要获取第一个json对象中的name属性的值:
SELECT get_json_object(pjson,"$.[0].age") FROM person;