HiveSQL 常用函数

1.常用日期、数值、集合、字符等处理函数

常用日期函数
--------------------------------------------------------------------------------
将日期格式转换为时间戳:unix_timestamp
select unix_timestamp(install_time) from table_name
--------------------------------------------------------------------------------
将时间戳格式转换为日期格式:from_unixtime
select from_unixtime(1603843200);
--------------------------------------------------------------------------------
select current_date;--current_date:当前日期
select current_timestamp;--current_timestamp:当前的日期加时间
select to_date('2020-10-28 12:12:12');--to_date:抽取日期部分
select year('2020-10-28 12:12:12');--year:获取年  
select month('2020-10-28 12:12:12');--month:获取月 
select day('2020-10-28 12:12:12');--day:获取日 
select hour('2020-10-28 12:12:12');--hour:获取时  
select minute('2020-10-28 12:12:12');--minute:获取分
select second('2020-10-28 12:12:12');--second:获取秒
select weekofyear('2020-10-28 12:12:12');--weekofyear:当前时间是一年中的第几周
select dayofmonth('2020-10-28 12:12:12');--dayofmonth:当前时间是一个月中的第几天
select months_between('2020-04-01','2020-10-28');--months_between: 两个日期间的月份
select add_months('2020-10-28',-3);--add_months:日期加减月
select datediff('2020-11-04','2020-10-28');  --datediff:两个日期相差的天数
select date_add('2020-10-28',4);--date_add:日期加天数
select date_sub('2020-10-28',-4);--date_sub:日期减天数
select last_day('2020-02-30');--last_day:日期的当月的最后一天
select date_format('2020-10-28 12:12:12','yyyy/MM/dd HH:mm:ss');--date_format(): 格式化日期
select add_months(current_date,-6);--获取6个月以前的日期
select trunc('2022-05-25','MM'); --获取当前月份的第一天
--------------------------------------------------------------------------------
常用取整函数
round: 四舍五入
select round(3.14);        select round(3.54);
ceil:  向上取整
select ceil(3.14);            select ceil(3.54);
floor: 向下取整
select floor(3.14);          select floor(3.54);
常用字符串操作函数
upper: 转大写             select upper('low');
lower: 转小写             select lower('low');
length:长度               select length(atguigu);
trim:  前后去空格         select trim( atguigu );
lpad: 向左补齐,到指定长度          select lpad('atguigu',9,'g');
rpad:  向右补齐,到指定长度         select rpad('atguigu',9,'g');
regexp_replace:使用正则表达式匹配目标字符串,匹配成功后替换!
SELECT regexp_replace('2020/10/25', '/', '-');
--------------------------------------------------------------------------------
集合操作
size: 集合中元素的个数
select size(friends) from test3;
map_keys: 返回map中的key
select map_keys(children) from test3;
map_values: 返回map中的value
select map_values(children) from test3;
array_contains: 判断array中是否包含某个元素
select array_contains(friends,'bingbing') from test3;
sort_array: 将array中的元素排序
select sort_array(friends) from test3;
grouping_set:多维分析
collect_list与collect_set
collect_list: 不去重
collect_set: 去重
--------------------------------------------------------------------------------
类型转换函数:cast
select cast(install_time as bigint) from tmp.tmp_huiben_user_behavior_ly2 limit 10;
--------------------------------------------------------------------------------
截取字符串函数:substr、substring
select substr('1631446654',1,2);     --16,表示从开始位置为1,截取长度为2,返回类型为String
select substring('1631446654',1);   --1631446654,截取开始位置为1到结尾的字符串,返回类型为String
--------------------------------------------------------------------------------
处理字符串:substring_index(str:要处理的字符串, delim:分隔符, count:计数)
连接字符串:CONCAT
CONCAT(t7.province_region_name,t7.city_region_name,t7.area_region_name) AS address_detail,       ----详细地址
--------------------------------------------------------------------------------
求总数(count) :select count(*) cnt from emp;
求最大值(max):select max(sal) max_sal from emp;
求最小值(min): select min(sal) min_sal from emp;
求总和  (sum): select sum(sal) sum_sal from emp;
求平均值(avg): select avg(sal) avg_sal from emp;
--------------------------------------------------------------------------------
空字段赋值:NVL( value,default_value)
select purchase_time, NVL(purchase_time,111) from tmp_huiben_user_behavior_ly1 limit 10;
--------------------------------------------------------------------------------
日期转换函数:to_date
to_date(from_unixtime(cast($receive_time/1000 as int)))
from_unixtime(cast(update_time/1000 as int),'yyyy-MM-dd')
--------------------------------------------------------------------------------
COALESCE(coalesce)是一个函数, (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。
--------------------------------------------------------------------------------
IF语句:如果第一个参数为true,就返回第二个值,否则返回第三个值
if(t.order_request_state = '0','无退款','有退款') as  order_request_state ,   --有无退款
if(t.order_relate_type = '0','无转单','有转单') as  order_relate_type      --有无转单
--------------------------------------------------------------------------------
split 字符分割函数
split(total,'-')[0] course_id
split('a,b,c,d',',')            得到的结果:[a,b,c,d]
split('a,b,c,d',',')[0]        得到的结果:a
split('192.168.0.1','\\.') 得到的结果:[192,168,0,1]
---------------------------------------------------------------------------------
两个日期之间的天数
datediff(t1.pay_time, t2.pay_time) AS day_lag,间隔为前面减去后面;
presto引擎中该函数为date_diff(‘day’,time1,time2)且时间间隔为后面减去前面。
---------------------------------------------------------------------------------
date_sub(date,xxx) 函数从日期减去指定的时间间隔
where lead_date >= date_sub(current_date, 180)
---------------------------------------------------------------------------------
ROUND:四舍五入
DATEDIFF:两个时间段之间的间隔
CURRENT_DATE:当前时间
ROUND(DATEDIFF(CURRENT_DATE(),DATE(t5.birthday)) / 365.2422) AS baby_birthday,      ----宝贝年龄
---------------------------------------------------------------------------------
ROE_NUMBER OVER(PARTITION BY 分组列 ORDER BY 排序列 DESC/ASC )
row_number()1开始,为每一条分组记录返回一个数字
SELECT
user_course_id,
class_teacher_id,
create_time,
row_number() over( partition by user_course_id order by create_time desc) rn
FROM dw.ods_edu_user_class
WHERE dt = '2022-01-18' limit 30
----------------------------------------------------------------------------------
lateral view
lateral view 函数用于将数据一行转多列,一般与explode、split、collect_set函数一起使用基本使用.
hive函数 lateral view 主要功能是将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,
从而得到明细表。配合UDTF函数使用,一般情况下经常与explode函数搭配,explode的操作对象(列值)是 ARRAY 或者 MAP,
可以通过 split 函数将 String 类型的列值转成 ARRAY 来处理。
----------------------------------------------------------------------------------
instr
instr(string str, string substr)
返回str中第一个substr的位置。如果其中str为null,则返回null;如果在str中找不到substr,则返回0

========================================================================================================================
JSON解析函数 get_json_object
取出第一个json对象
[{"name":"wenxin","age":"18","set":"男"},{"name":"lanwa","age":"20","set":"女"}]
select get_json_object('[{"name":"wenxin","age":"18","set":"男"},{"name":"lanwa","age":"20","set":"女"}]','$[0]')
result:{"name":"wenxin","age":"18","set":"男"}
取出第一个json的某个字段
select get_json_object('[{"name":"wenxin","age":"18","set":"男"},{"name":"lanwa","age":"20","set":"女"}]','$[0].name')
result:wenxin
========================================================================================================================
ods_log表只有一个字段,为json格式,需要将ods表进行清洗输出到dwd层
++++++++++++++++++
+  line  |  dt   +
++++++++++++++++++
+ {json} |22-1-13+
++++++++++++++++++
insert overwirte table dwd_start_log partirion(dt='$YESTERDAY')
select
    get_json_object(line,'$.common.ar'),
    get_json_object(line,'$.common.ba'),
    get_json_object(line,'$.common.ch')
from ods_log
where dt='$YESTERDAY'
and get_json_object(line,'$.start') is not null;
========================================================================================================================
sparksql使用get_json_object函数异常  
    “   invalid stringinterpolation:`$$', `$'ident or `$'BlockExpr expected  ”  无效的字符串插值:应为“$$”、“$”ident或“$”BlockExpr->Spark SQL
您添加了s前缀,这意味着您希望对字符串进行插值。这意味着所有前缀为$的标记都将替换为同名的局部变量。从代码中看,您似乎不使用此功能,因此您可以从字符串中删除s前缀。
解决方案:https://www.runexception.com/q/4635
==========================================================================================================================
json_tupe
https://wenku.baidu.com/view/243bc2cf142ded630b1c59eef8c75fbfc67d9470.html
当使用json_tuple对象时,可以显著提高效率,一次获取多个对象并且可以被组合使用

========================================================================================================================
行转列
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。
分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。
这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

注意: CONCAT_WS must be "string or array<string>

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生 Array 类型字段。
========================================================================================================================
列转行
1)函数说明

EXPLODE(col):将 hive 一列中复杂的 Array 或者 Map 结构拆分成多行。

LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:用于和 split, explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
开窗函数
--------------------------------------------------------------------------------
OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。
CURRENT ROW:当前行
n PRECEDING:往前 n 行数据
n FOLLOWING:往后 n 行数据
UNBOUNDED:起点
UNBOUNDED PRECEDING 表示从前面的起点,
UNBOUNDED FOLLOWING 表示到后面的终点
LAG(col,n,default_val):往前第 n 行数据
LEAD(col,n, default_val):往后第 n 行数据
NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从 1 开始,对于每一行,NTILE 返回此行所属的组的编号。
注意:n 必须为 int 类型。
--------------------------------------------------------------------------------
row_number() over(partition by 分组列 order by 排序列 desc) --分组排序
语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
ROW_NUMBER() OVER (PARTITION BY year_user_id,year_order_id,year_course_id ORDER BY train_create_time DESC) AS rank
--------------------------------------------------------------------------------
hive 常用排序函数  row_number、rank、dense_rank
rank:
    23 1
    23 1
    22 3
dense_rank:
    23 1
    23 1
    22 2
row_number:
    23 1
    23 2
    22 3
--------------------------------------------------------------------------------

2.常用窗口函数

OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。
CURRENT ROW:当前行
n PRECEDING:往前 n 行数据
n FOLLOWING:往后 n 行数据
UNBOUNDED:起点
UNBOUNDED PRECEDING 表示从前面的起点,
UNBOUNDED FOLLOWING 表示到后面的终点
LAG(col,n,default_val):往前第 n 行数据
LEAD(col,n, default_val):往后第 n 行数据
NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从 1 开始,对于每一行,NTILE 返回此行所属的组的编号。
注意:n 必须为 int 类型。
--------------------------------------------------------------------------------
row_number() over(partition by 分组列 order by 排序列 desc) --分组排序
语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
ROW_NUMBER() OVER (PARTITION BY year_user_id,year_order_id,year_course_id ORDER BY train_create_time DESC) AS rank
--------------------------------------------------------------------------------
hive 常用排序函数  row_number、rank、dense_rank
rank:
    23 1
    23 1
    22 3
dense_rank:
    23 1
    23 1
    22 2
row_number:
    23 1
    23 2
    22 3
--------------------------------------------------------------------------------

你可能感兴趣的:(#,Hive,hive,大数据)