1.常用日期、数值、集合、字符等处理函数
常用日期函数
将日期格式转换为时间戳:unix_timestamp
select unix_timestamp(install_time) from table_name
将时间戳格式转换为日期格式:from_unixtime
select from_unixtime(1603843200);
select current_date;
select current_timestamp;
select to_date('2020-10-28 12:12:12');
select year('2020-10-28 12:12:12');
select month('2020-10-28 12:12:12');
select day('2020-10-28 12:12:12');
select hour('2020-10-28 12:12:12');
select minute('2020-10-28 12:12:12');
select second('2020-10-28 12:12:12');
select weekofyear('2020-10-28 12:12:12');
select dayofmonth('2020-10-28 12:12:12');
select months_between('2020-04-01','2020-10-28');
select add_months('2020-10-28',-3);
select datediff('2020-11-04','2020-10-28');
select date_add('2020-10-28',4);
select date_sub('2020-10-28',-4);
select last_day('2020-02-30');
select date_format('2020-10-28 12:12:12','yyyy/MM/dd HH:mm:ss');
select add_months(current_date,-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);
select substring('1631446654',1);
处理字符串: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:
==========================================================================================================================
json_tupe
https:
当使用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