Hive函数划分介绍:
函数介绍:
函数就是开发者定义好的规则, 我们只要调用指定的函数, 传入对应的参数, 就能获取对应的结果, 我们无需关心函数内部是如何执行的, 只要会调用即可.
可以把函数理解为是人们研发的机器, 不同的机器所需的原材料(参数)是不一样的, 传入不同的原材料(参数), 就会获取不同的结果.
概述:
最初Hive的函数分为 内置函数 和 用户自定义函数两大类, 而用户自定义函数又分为 UDF, UDAF, UDTF三种.
后来人们(程序员)发现用 UDF, UDAF, UDTF来划分hive函数太方便精准了, 于是在Hive2.X版本中提出了1个概念: 函数标准扩大化.
即: 从Hive2.4X开始, Hive中的函数就只有: UDF, UDAF, UDTF三种了.
分类:
UDF: 全称 user defined functions, 也叫: 普通函数.
核心: 一进一出. 即: 给函数10行数据, 处理之后, 返回10行.
例如:
select abs(-10); -- 10
select round(10.123, 2); -- 10.12
UDAF: 全称 user defined Aggregate functions, 也叫: 聚合函数.
核心: 多进一出, 即: 给函数10行数据, 处理之后, 返回1行.
例如:
select count(sid) from student;
UDTF: 全称 user defined Table Generating functions, 也叫: 表生成函数.
核心: 一进多出, 即: 给函数1条, 它返回多条.
例如:
select explode(array('aa', 'bb', 'cc'));
如果某个函数不会用, 可以查看下它的说明文档,
官网网址: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-MathematicalFunctions
函数基础语法:
show functions ; -- 查看hive所有的函数, hive中符号也是函数, 只不过是: 函数名为符号而已.
describe function abs; -- 查看函数的说明文档(简单信息)
describe function extended abs; -- 查看函数的说明文档(详细信息).
演示:split(参数1,参数2)函数, 参数1:要切割的字符串,参数2:切割符(支持正则)
select split('a1b2c3d', '1'); -- ["a","b2c3d"], 按照数字1对字符串切割
select split('a1b2c3d', '[0-9]'); -- ["a","b","c","d"], 按照数字对字符串切割
select split('a1b2c3d', '\\d+'); -- ["a","b","c","d"], 按照数字对字符串切割
concat()函数,默认的拼接符数:' ',可以拼接任意类型
select concat('-', 'aa', 'bb', 11, 'false'); -- -aabb11false
concat_ws()函数, 可以指定拼接符. 参1: 拼接符号, 参2.... 要拼接的内容.
select concat_ws('-', 'aa', 'bb', 'cc', array('x', 'y', 'z')); -- 只能拼字符串, 或者字符串数组 aa-bb-cc-x-y-z
trim()函数, 移除两端空格.
select trim(' aa bb '); -- 'aa bb'
substr()函数, 参1: 要操作的字符串, 参2:从几开始截取,默认从1开始计数. 参3: 截取几个.
select substr('hello world hive', 7); -- world hive, 从7开始, 截取到结尾.
select substr('hello world hive', 7, 5); -- world hive, 从7开始, 截取5个
select substr('hello world hive', -4); -- hive, 从-4索引(从右往左数, 从-1开始)
select substr('hello world hive', 13); -- hive, 从13索引开始.
select substr('2024-01-14 10:16:19', 1, 10); -- 年月日
select substr('2024-01-14 10:16:19', 6, 2); -- 月
select substr('2024-01-14 10:16:19',9, 2); -- 日
substring()函数, 效果同substr()函数一样
select substring('2024-01-14 10:16:19', 1, 10); -- 年月日
select lower('ABC123'); -- abc123
select upper('abc123'); -- ABC123
regexp_replace()函数, 正则替换, 参1: 要操作的字符串, 参2: 正则表达式, 参3: 替换后的内容.
select regexp_replace('aa11bb22cc33dd', '\\d+', '#');
parse_url()函数, 从URL地址中解析出指定的内容. 参1: url地址, 参2: 要解析出的内容, 例如: HOST, PATH, QUERY
-- 域名 文件路径 参数
select parse_url('https://www.itcast.cn/index.html?username=root&password=123456', 'HOST'); -- www.itcast.cn
select parse_url('https://www.itcast.cn/index.html?username=root&password=123456', 'PATH'); -- /index.html
select parse_url('https://www.itcast.cn/index.html?username=root&password=123456', 'QUERY'); -- username=root&password=123456'
select parse_url('https://www.itcast.cn/index.html?username=root&password=123456', 'QUERY', 'username'); -- root
get_json_object(), 处理json字符串的. 参1: json字符串, 参2: 从json中解析出对应内容, 可以用 $代表整个json字符串 或者 json数组.
json字符串介绍:
概述:
它是一种特殊规则的字符串, 由键值对组成. 只要用双引号包裹.
格式:
{"键":"值", "键":"值"}
作用:
一般是前后端传输数据的, 跨域传输, 例如: 前端把数据封装好 然后传入到 后台代码中.
细节:
json字符串也有数组形式: [{"键":"值", "键":"值"}, {"键":"值", "键":"值"}...]
select get_json_object('{"name":"乔峰", "age":31}', '$.name'); -- 乔峰
select get_json_object("{'name':'乔峰', 'age':31}", '$.name'); -- null, json字符串用双引号包裹.
-- json数组
select get_json_object('[{"name":"乔峰", "age":31}, {"name":"虚竹", "age":29}]', '$.[1].name'); -- 虚竹, 索引从0开始.
select `current_timestamp`(); -- 2024-01-14 10:57:23.763000000
select `current_date`(); -- 2024-01-14
即: 从时间原点(1970年1月1日 00:00:00) 至 当前时间的秒值
select unix_timestamp(); -- 1705201180
select unix_timestamp('1970-01-01 00:00:01'); -- 1, 获取时间原点 ~ 指定时间的秒值.
select from_unixtime(1705201180); -- 2024-01-14 02:59:40
select to_date(`current_timestamp`());
当前时间的秒值 - 你出生那天的秒值
select unix_timestamp() - unix_timestamp('2002-08-07 00:00:00'); -- 676523149秒
select (unix_timestamp() - unix_timestamp('2002-08-07 00:00:00')) / 3600 / 24; -- 7830.129537037036....
select datediff('2024-01-10 00:00:00', '2024-01-05 00:00:00'); -- 结果: 前 - 后, 5
select year('2024-01-10 13:14:21');
select month('2024-01-10 13:14:21');
select day('2024-01-10 13:14:21');
select hour('2024-01-10 13:14:21');
select minute('2024-01-10 13:14:21');
select second('2024-01-10 13:14:21');
select quarter('2024-01-10 13:14:21');
select date_add('2024-01-10 13:14:21', 2); -- 往后推2天, 2024-01-12
select date_sub('2024-01-10 13:14:21', -2); -- 往后推2天, 2024-01-12, subtract: 减法
select date_add('2024-01-10 13:14:21', -2); -- 往前推2天, 2024-01-08
select date_sub('2024-01-10 13:14:21', 2); -- 往前推2天, 2024-01-08, subtract: 减法
select abs(-10); -- 10
select round(10.312, 2); -- 10.31
select round(10.315, 2); -- 10.32
select rand(); -- 0.0 ~ 1.0之间, 包左不包右.
-- 新需求: 获取1个 1 ~ 100之间的随机数
select int(rand() * 100) + 1; -- rand() * 100 获取 0.0 ~ 100.0 之间, 包左不包右的数字.
比这个数字大的所有数字中, 最小的那个整数.
select ceil(10.3); -- 11
select ceil(10.0); -- 10
select floor(10.3); -- 10
select floor(10.0); -- 10
计平方值, a的b次幂
select pow(3, 2); -- 9
做判断的, 条件成立返回值1, 条件不成立返回值2. 参1: 关系表达式, 参2: 值1, 参3: 值2
select if(5 > 3, '成立', '不成立');
select isnull(''); -- false
select isnull(null); -- true
select isnotnull(''); -- true
select isnotnull(null); -- false
判断参1是否为空, 不为空就返回其值, 为空就返回值2.
select nvl('乔峰', '虚竹'); -- 乔峰
select nvl(null, '虚竹'); -- 虚竹
获取众多参数中的第1个非空值.
select coalesce(null, null, null); -- null
select coalesce(null, null, 1, 2, 3); -- 1
select coalesce(null, 'y', null, 'a', '10'); -- y
select coalesce('a', '10', 'b', '20'); -- 'a'
select
case
when 5 > 3 then '大于'
when 5 < 3 then '小于'
else '等于'
end as col1;
select cast(10.3 as int); -- 10
select cast(10.6 as int); -- 10
select cast(10 as string); -- '10'
select cast('123' as int); -- 123, 字符串 -> 数字
select cast('123' as boolean); -- true, 非空 '', 非0, 非null
select cast('' as boolean); -- false
select hash('abc'); -- 96354
select md5('Aa1'); -- 698d51a19d8a121ce581499d7b701668
select sha1('Aa1'); -- f55cd2f8d3186c960aa86782452979118760e96d
select sha2('Aa1', 512); -- 2907b40d2cb5527fe522b1c97f90dbf49423dd0cfd411f5d91528bc38c0c2ee9515d981816149d138ffa9d2ac80ef1d0435dc0213bdb85b2f85f446c4a035f3f
describe function extended sha2;
select crc32('Aa1'); -- 2736874553
select mask('xyzABC123'); --结果为: xxxXXXnnn, 默认顺序是: 大写字母X, 小写字母x, 数字n
-- 需求: 我想指定小写字母用 小 来替换. 参1: 要脱敏的字符串. 参2: 大写字母替换符, 参3: 小写字母替换符, 参4: 数字替换符.
select mask('xyzABC123', 'X', '小'); -- xxx小小小nnn
select mask_first_n('ABCabc123', 4); -- XXXxbc123 只处理前 4 个字符.
select mask_show_first_n('ABCabc123', 4); -- ABCaxxnnn 除了前 4 个字符, 其它都处理.
select concat(substr('13112345678', 1, 3), mask(substr('13112345678', 4, 4), 'X', 'x', '*'), substr('13112345678', -4));
对数组进行排序, 属于: 集合函数.
select sort_array(array(11, 33, 22, 55)); -- [11,22,33,55]
select current_user(); -- root
select current_database();
select version(); -- 3.1.2