目录
2 字符串函数
2.1 字符串函数
(1) 获取字符串的长度
-- 返回字符串的长度,要求参数必须是UTF-8编码,否则返回-1
length(string str)(2) 解析json
-- param1:需要解析的json字段;param2:遇到数组就用 [0,1,2...] 0,1,2是数组对应的元素,遇到jsonObject直接用 ".key"取出想要获取的value.
-- 例[{"name":"王二","sex":"男","age":"25"},{"name":"李狗嗨","sex":"男","age":"47"}]:SELECT get_json_object(xjson,"$.[0].age") FROM person;
get_json_object(param1,"$.param2")2.2 字符串处理
(1) 字符串拼接
-- concat
-- 将多个字段拼接成字符串
-- 如有任何一个参数为NULL,则返回值为NULL
concat(str1,str2,…)
-- concat_ws
-- 将多个字段用分割符拼接成字符串
-- 如果分隔符为NULL,则结果为NULL.函数会忽略任何分隔符参数后的NULL值.但不会忽略''
concat_ws(separator,str1,str2,…)
-- wm_concat
-- 将多个字段用分割符拼接成字符串,返回一条记录,可配合分组函数使用
wm_concat(分隔符,字段)(2) 截取字符串
-- 返回字符串A从下标start位置开始,长度为len的字符串;substring(string A,int start,int len)作用相同
substr(string A,int start,int len)(3) 拆分字符串
-- 按照pat字符串分割str,会返回分割后的字符串数组
split(string str, string pat)3 时间函数
3.1 时间获取
(1) 获取当前时间的时间戳
unix_timestamp()3.2 时间转化
(1) 时间转时间戳
-- 把时间格式转换成时间戳,得到参数对应的时间戳,参数date要满足'yyyy-MM-dd' HH:mm:ss'或'yyyy-MM-dd';
unix_timestamp(datatime)(2) 时间戳转时间
-- tt为10位数的时间戳,把时间戳转换成时间格式
from_unixtime(tt)
from_unixtime(tt,'yyyy-MM-dd')(3) 格式化时间
-- 根据format字符串格式化date值
date_format(datatime,format)3.3 时间处理
(1) 计算时间差
-- 计算两个时间的差值,并转换成指定的单位
datediff(end_datetime,start_datetime,datepart)(2) 修改时间
-- 按照指定的单位和幅度修改时间
dateadd(datetime,delta,datepart)5 窗口函数
5.1 排序
-- row_number
/* 按照partition by后的列对所有行分组,对于每一组,根据order by后的列,给每一行分配一个序号
,从1开始.排序相同时序号不会重复 */
row_number() over(partition by col_list1 order by col_list2)
-- rank
/* 按照partition by后的列对所有行分组,对于每一组,根据order by后的列,给每一行分配一个序号
,从1开始.对相同的数值,输出相同的序号,下一个序号跳过 */
rank() over(partition by col_list1 order by col_list2)
-- dense_rank
/* 按照partition by后的列对所有行分组,对于每一组,根据order by后的列,给每一行分配一个序号
,从1开始.对相同的数值,输出相同的序号,下一个序号不会跳过 */
dense_rank() over(partition by col_list1 order by col_list2)5.2 聚合
(1) 求和
-- 按照partition by后的列对所有行分组,每组聚合.
-- 如使用了order by,则只取截止到当前行的数据来聚合
sum(列名) over(partition by col_list1 [order by col_list2 asc/desc])(2) 求平均值
-- 按照partition by后的列对所有行分组,每组聚合.
-- 如使用了order by,则只取截止到当前行的数据来聚合
avg(列名) over(partition by col_list1 [order by col_list2 asc/desc])(3) 计数
-- 按照partition by后的列对所有行分组,每组聚合.
-- 如使用了order by,则只取截止到当前行的数据来聚合
count(*) over(partition by col_list1 [order by col_list2 asc/desc])
count(1) over(partition by col_list1 [order by col_list2 asc/desc])
count([distinct] 列名) over(partition by col_list1 [order by col_list2 asc/desc])(4) 求最大值
-- 按照partition by后的列对所有行分组,每组聚合.
-- 如使用了order by,则只取截止到当前行的数据来聚合
max(列名) over(partition by col_list1 [order by col_list2 asc/desc])(5) 求最小值
-- 按照partition by后的列对所有行分组,每组聚合.
-- 如使用了order by,则只取截止到当前行的数据来聚合
min(列名) over(partition by col_list1 [order by col_list2 asc/desc])6 逻辑函数
6.1 条件判断
(1) if
if(表达式,结果1,结果2)(2) nvl
-- 如果字段值为null,则返回 值1,否则返回 字段值
nvl(字段,值1)(3) case when
-- 表达式1成立时,返回 值1;表达式1不成立 且 表达式2成立时,返回 值2;否则返回 值3
-- 不加else子句时,如果when后的表达式都不成立,则返回null
case when 表达式1 then 值1
when 表达式2 then 值2
...
else 值3
end7 其它函数
(1) 查看支持的函数
show functions;(2) 数据类型转换
-- cast:数据类型转换
cast(字段名 as 转换的类型)
-- to_char:将布尔型、整型或者浮点型数值转为对应的字符串
to_char(字段名)8 自定义UDF函数
①继承UDF或者UDAF或者UDTF,重写evaluate方法;
②将写好的类打包为jar,如LowerUDF.jar;
③进入到Hive shell环境中,输入命令add jar /home/hadoop/LowerUDF.jar注册该jar文件
④为该类起一个别名,create temporary function lower_udf as 'UDF.lowerUDF';
版权声明:本文为weixin_43875878原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。