1、pmod(int a, int b):返回a除以b的余数的绝对值;
cast(aaa as int):将string转化成int;
cast(aaa as decimal(10, 2)):将string转化成float,保留两位小数;
2、trim(String A):去除A两侧的空格;
ltrim(String A):去除左边空格;
rtrim(String A):去除右边空格
select trim('abc') from lxw_dual;
3、concat_ws (separator,str1,str2,...) :根据固定的分隔符连接后侧字符串;
concat_ws第一个参数是其它参数的分隔符,分隔符的位置放在要连接的两个字符串之间,分隔符可以是一个字符串,也可以是其他参数。
select concat_ws(',','11','22','33'); 11,22,33
4、collect_list/collect_set列转行函数:
在本地文件系统创建测试文件:
存储在hive表中:
按用户分组,取出每个用户每天看过的所有视频的名字:
上面结果中,由于霸王别姬李四看了两遍,所以列表中存在重复,去重处理collect_set()
突破group by限制:
还可以利用collect来突破group by的限制,hive中在group by查询的时候要求出现在select后面的列都必须出现在group by的后面
即select列必须作为分组依据的列,但有的时候我们想根据A分组然后随便取出每个分组中的一个B,带入到这个实验中就是按照
用户进行分组,然后随便拿出一个他看过的视频名称即可:
eg:
collect_list:该函数功能等同于collect_set,唯一的区别在于collect_set会去除重复元素,collect_list不去除重复元素,示例sql如下
with t as ( select 1 id,123 value union all select 1 id,234 value union all select 2 id,124 value union all select 2 id,124 value ) select t.id,collect_set(t.value),collect_list(t.value) from t group by t.id
collect_set:
该函数只接受基本的数据类型,主要作用是将某字段的值进行去重汇总,返回值是array类型字段
with t as ( select 1 id,123 valu union all select 1 id,234 value union all select 2 id,124 value ) select t.id,collect_set(t.value) from t group by t.id
5、get_json_object(string json_string,string path):
该函数的第一个参数是json对象变量,第二个参数使用$表示json变量标识,然后用.或[]读取对象或数组
select get_json_object(pricecount,'$.buyoutRoomRequest') new_id,pricecount from table_sample a where d='2018-08-31' limit 100
6、json_tuple(string json_string,string k1,string k2...)
该函数的第一个参数是json对象变量,之后的参数是不定长参数,是一组键k1,k2...,返回值是元组,该方法比get_json_object高效,因为可以在一次调用中输入多个键值
select m.*,n.pricecount from (select from table_sample a where d='2018-08-31' limit 100)n lateral view json_tuple(pricecount,'paymentType','complete') m as f1,f2
7、split(str,regex):数据切分。
Splits str arround occourances that match regex.该函数第一个参数是字符串,第二个参数是设定的分隔符,通过第二个参数把第一个参数做拆分,返回一个数组
select split('123,3455,2568',',') select split('sfas:sdfs:sf',':')
8、explode():
该函数接收一个参数,参数类型需是array或者map类型,该函数的输出是把输入参数的每个元素拆成独立的一行记录。
select explode(split('123,3455,2568',','))
9、lateral view():
Lateral View 一般与用户自定义表生成函数(如explode())结合使用。UDTF为每个输入行生成零个或多个输出行,Lateral view首先将UDTF应用于基表的每一行,然后将结果输出行连接到输入行,已形成具有提供的表别名的虚拟表。
select j.nf,p.* from ( select m.*,n.pricecount from (select * from ods_htl_htlinfogoverndb.buyout_appraise a where d =
'${zdt.format("yyyy-MM-dd")}' limit 100)n lateral view json_tuple(pricecount,'paymentType','complete') m as f1,f2 )p lateral view explode(split(regexp_replace(p.f1,'\\[|\\]',''),',')) j as nf
结合:hive中行变列和列变行的函数:
collect_list()与collect_set()是将数据列变行;
explode()与lateral view是将数据行变列;
eg:
select items_page, num
from data_limit
lateral view explode(items_pages) good as items_page
其中:
1)explode是将items_pages行变列;
2)good是虚拟表,用来存储explode之后的数据,并定义列名为items_page;
3)lateral view是将items_page与上面的字段num进行笛卡尔积,呈现出多列表示;
10、str_to_map(String text,String delimiter1,String delimiter2)
使用两个分隔符将文本拆分成键值对。Delimiter1将文本分成k-v对,Delimiter2分割每个k-v对。对于delimiter1的默认值是',',delimiter2的默认值是'='.
select str_to_map('abc:11&bcd:22', '&', ':')
11、array_contains(Array<T>,value)
该函数的用来判断Arrary<T>中是否包含元素value,返回值是boolean
select array_contains(array(1,2,3,4,5),3) true
12、percentile(expr,pc):
该函数用来计算参数expr的百分位数,expr:字段类型必须是INT,否则报错;pc:百分位数,已数值形式传入
13、percentile_approx(expr,pc,[nb])
该函数也是用来计算参数expr的百分位数,但数据类型要求没有percentile严格,该函数数值类似类型都可以;pc:百分位数,可以以数组形式传入,因此可以一次性查看多个指定百分位数;[nb]:控制内存消耗的精度,选填
14、数学函数:
(1)round:四舍五入 select round(数值,小数点位数);
(2)ceil:向上取整 select ceil(45.6);
(3)floor:向下取整 select floor(45.6);
15、字符函数:
(1)lower:转成小写
select lower('Hive'); --hive
(2)upper:转成大写
select lower('Hive'); --HIVE
(3)length:长度
select length('Hive'); --4
(4)concat:拼接字符串
select concat('hello','Hive'); --helloHive
(5)substr:求子串
select substr('hive',2); --ive
select substr('hive',2,1); --i
(6)trim:去掉前后的空格
select trim(' hive '); -hive
(7)lpad:左填充
对hive填充到10位,补位用#
select lpad('hive',10,'#'); --######hive
(8)rpad:右填充
select rpad('hive',10,'#'); --hive######
16、日期函数:
(1)to_date
select to_date('2015-06-01 15:34:23'); --2015-06-01
(2)year
select year('2015-05-22 15:34:23'); --2015
(3)month
select month('2015-05-22 15:34:23'); --5
(4)day
select day('2015-05-22 15:34:23'); --22
(5)weekofyear
select weekofyear('2015-05-22 15:34:23'); --21
(6)datediff(date,date1):日期差,即两个日期差几天,months_between(date,date1),两个日期差几月,用法一致。
select datediff('2015-05-22 15:34:23','2015-05-29 15:34:23'); --[-7]
(7)date_add:在现在日期上增加天数,add_months是增加月份,用法一致。
select date_add('2015-05-22 15:34:23',2); --2015-05-24
(8)date_sub:在现在日期上减少天数
select date_sub('2015-05-22 15:34:23',2); --2015-05-20
(9)date_format(string/date,dateformate):把字符串或者日期转成指定格式的日期。
select date_format('2018-09-12','yyyy-MM-dd HH:mm:ss') as date_time,date_format('2018-09-12','yyyyMMdd') as date_time1 from dual;--2018-09-12 00:00:00
(10)unix_timestamp(date,dateformat):日期格式转化为时间戳,如果括号内没有参数则表示返回当前的时间戳。
select unix_timestamp() as time_stamp,unix_timestamp('2018-09-26 9:13:26','yyyy-MM-ddHH:mm:ss') as time_stamp1 from dual;
(11)from_unixtime(timestamp,dateformat):将时间戳转化为日期格式,格式必须是10位,毫秒级的时间戳需要用cast转化成秒级。
select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') asdate_time,from_unixtime(1537924406,'yyyy-MM-dd') as date_time1 from dual;
from_unixtime(cast(unix_timestamp()/1000 as int),'yyyy-MM-dd HH:mm:ss') as date_time
(12)last_day(date):获取月末最后一天:
select last_day('2018-09-30') as date_time,last_day('2018-09-27 21:16:13') as date_time1 from dual;--2018-09-30
(13)trunc(date,format) format:MONTH/MON/MM, YEAR/YYYY/YY:返回月初、年初
select trunc('2018-09-27','YY') as date_time,trunc('2018-09-27 21:16:13','MM') as date_time1 from dual;
--2018-01-01和2018-09-01
(14)next_day(date,formate) format:英文星期几的缩写或者全拼:当前日期下个星期X的日期。
select next_day('2018-09-27','TH') as date_time,next_day('2018-09-27 21:16:13','TU') as date_time1 from dual;
--2018-10-04和2018-10-02
17、常用函数上:https://blog.csdn.net/Forever_ck/article/details/85268145
常用函数下:https://blog.csdn.net/Forever_ck/article/details/85268773
常用函数总结:https://blog.csdn.net/weixin_41907511/article/details/84826469
18、条件函数:
select nvl(T v1, T default_value); -- 如果v1不为null,返回v1否则defaultV
select if(boolean testCondition, T valueTrue, T valueFalseOrNull); --if条件判断表达式
select coalesce(T v1, T v2, T v3, ...); --返回第一个不为null的value值
19、UNION ALL
是上下关联两个hive表,其中各个关联部分的字段名称必须一致,否则报错;
20、删除表信息:
-- 删除库
drop database if exists db_name;
-- 强制删除库
drop database if exists db_name cascade;
-- 删除表
drop table if exists employee;
-- 清空表
truncate table employee;
-- 清空表,第二种方式
insert overwrite table employee select * from employee where 1=0;
-- 删除分区
alter table employee_table drop partition (stat_year_month>='2018-01');
-- 按条件删除数据
insert overwrite table employee_table select * from employee_table where id>'180203a15f';
21、row_number()函数:
row_number() over(distribute by col1 sort by clo2 desc)
22、正则表达式的应用:
regexp_extract(string subject, string pattern, int index)函数的应用;
将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。
select clientcode
,regexp_extract(filterlist,'(filtertype"\\:")(\\d+)(",)',2) as filtertype
,regexp_extract(filterlist,'(filtername"\\:")((\\W*\\w*)|(\\W*))(",)',2) as filtername
,regexp_extract(filterlist,'(filtertitle"\\:")((\\W*\\w*)|(\\W*))(",)',2) as filtertitle
,regexp_extract(filterlist,'(filterid"\\:")(\\d+\\|\\d+)(",)',2) as filterid
from tmp_action_click
来源:CSDN
作者:livan1234
链接:https://blog.csdn.net/livan1234/article/details/103837446