利用第三方工具(DataGrip)连接Hive
1.创建虚拟机,配置hive环境
2.在Windows系统中登进hdfs页面
输入以下命令:
start-all.sh
mapred --daemon start historyserver
nohup hive --service metastore &
nohup hive --service hiveserver2 &
lsof -i:10000
在Windows系统中输入:主机名:9870,查看是否连接成功
3.连接hive
Hive函数分类
Hive函数划分介绍:
函数介绍(大白话):
函数就是开发者定义好的规则, 我们只要调用指定的函数, 传入对应的参数, 就能获取对应的结果, 我们无需关心函数内部是如何执行的, 只要会调用即可.
可以把函数理解为是人们研发的机器, 不同的机器所需的原材料(参数)是不一样的, 传入不同的原材料(参数), 就会获取不同的结果.
概述:
最初Hive的函数分为 内置函数 和 用户自定义函数两大类, 而用户自定义函数又分为 UDF, UDAF, UDTF三种.
后来人们(程序员)发现用 UDF, UDAF, UDTF来划分hive函数太方便精准了, 于是在Hive2.X版本中提出了1个概念: 函数标准扩大化.
即: 从Hive2.4X开始, Hive中的函数就只有: UDF, UDAF, UDTF三种了.
分类:
UDF: 全称 user defined functions, 也叫: 普通函数.
核心: 一进一出. 即: 给函数10行数据, 处理之后, 返回10行.
例如: abs(), round()...
UDAF: 全称 user defined Aggregate functions, 也叫: 聚合函数.
核心: 多进一出, 即: 给函数10行数据, 处理之后, 返回1行.
例如: count(), max(), sum(), avg(), min()
UDTF: 全称 user defined Table Generating functions, 也叫: 表生成函数.
核心: 一进多出, 即: 给函数1条, 它返回多条.
例如: explode() 爆炸函数(炸裂函数)
Hive常用函数(详解)
字符串相关函数
-- 演示: 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()函数, 效果同上.
select substring('2024-01-14 10:16:19', 1, 10); -- 年月日
-- 演示: lower()函数,
select lower('ABC123'); -- abc123
-- 演示: upper()函数,
select upper('abc123'); -- ABC123
-- 演示: regexp_replace()函数, 正则替换, 参1: 要操作的字符串, 参2: 正则表达式, 参3: 替换后的内容.
select regexp_replace('aa11bb22cc33dd', '\\d+', '#');
select get_json_object('{"name":"乔峰", "age":31}', '$.name');
select get_json_object("{'name':'乔峰', 'age':31}", '$.name');
select get_json_object('[{"name":"乔峰", "age":31}, {"name":"虚竹", "age":29}]', '$.[1].name');
日期相关函数
-- 1. 获取当前的时间戳.
select `current_timestamp`(); -- 2024-01-14 10:57:23.763000000
-- 2. 获取当前的时间.
select `current_date`(); -- 2024-01-14
-- 3. 获取当前的秒值, 即: 从时间原点(1970年1月1日 00:00:00) 至 当前时间的秒值
select unix_timestamp(); -- 1705201180
select unix_timestamp('1970-01-01 00:00:01'); -- 1, 获取时间原点 ~ 指定时间的秒值.
-- 4. 把秒值 转成对应的 时间.
select from_unixtime(1705201180); -- 2024-01-14 02:59:40
-- 5. 根据时间戳, 获取指定的日期: 年-月-日
select to_date(`current_timestamp`());
-- 6. 计算下你活了多少天.
-- 当前时间的秒值 - 你出生那天的秒值
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....
-- 7. 计算两个日期的差值.
select datediff('2024-01-10 00:00:00', '2024-01-05 00:00:00'); -- 结果: 前 - 后, 5
-- 8. 从日期中获取对应的内容.
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'); -- 掌握, 季度.
-- 9. 偏移指定的时间.
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: 减法
数字相关函数
-- 1. 求绝对值.
select abs(-10); -- 10
-- 2. 四舍五入. round
select round(10.312, 2); -- 10.31
select round(10.315, 2); -- 10.32
-- 3. 随机数
select rand(); -- 0.0 ~ 1.0之间, 包左不包右.
-- 新需求: 获取1个 1 ~ 100之间的随机数
select int(rand() * 100) + 1; -- rand() * 100 获取 0.0 ~ 100.0 之间, 包左不包右的数字.
-- 4. ceil() 天花板数, 比这个数字大的所有数字中, 最小的那个整数.
select ceil(10.3); -- 11
select ceil(10.0); -- 10
-- 5. floor() 地板数.
select floor(10.3); -- 10
select floor(10.0); -- 10
-- 6. pow(a, b), 计平方值, a的b次幂
select pow(3, 2); -- 9
-- 7. 面试题: 四舍五入的原理是什么? +0.5, 然后求地板数.
select `floor`(10.3 + 0.5); -- 10
select `floor`(10.4 + 0.5); -- 10
select `floor`(10.5 + 0.5); -- 11
转换相关函数
-- 1. if()函数, 做判断的, 条件成立返回值1, 条件不成立返回值2. 参1: 关系表达式, 参2: 值1, 参3: 值2
select if(5 > 3, '成立', '不成立');
-- 2. isnull() 判断是否为空.
select isnull(''); -- false
select isnull(null); -- true
-- 3. isnotnull() 判断是否不为空.
select isnotnull(''); -- true
select isnotnull(null); -- false
-- 4. nvl() 空值转换, 判断参1是否为空, 不为空就返回其值, 为空就返回值2.
select nvl('乔峰', '虚竹'); -- 乔峰
select nvl(null, '虚竹'); -- 虚竹
-- 5. coalesce(值1, 值2...) 获取众多参数中的第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'
-- 6. case when
select
case
when 5 > 3 then '大于'
when 5 < 3 then '小于'
else '等于'
end as col1;
-- case when语法糖, 如果都是等于判断, 且是同一列, 可以简写为如下写法.
select
case 1 -- 应该是: case 列名
when 1 then '星期一'
when 2 then '星期二'
when 3 then '星期三'
else '没有这样的时间'
end as week;
-- 7. cast()函数, 类型转换.
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
加密, 脱敏相关函数
-- 1. 获取哈希值.
select hash('abc'); -- 96354
-- 2. 加密相关函数.
select md5('Aa1'); -- 698d51a19d8a121ce581499d7b701668
select sha1('Aa1'); -- f55cd2f8d3186c960aa86782452979118760e96d
describe function extended sha2;
select crc32('Aa1'); -- 2736874553
-- 3. 脱敏相关.
select mask('xyzABC123'); --结果为: xxxXXXnnn, 默认顺序是: 大写字母X, 小写字母x, 数字n
-- 细节: 我想指定小写字母用 小 来替换. 参1: 要脱敏的字符串. 参2: 大写字母替换符, 参3: 小写字母替换符, 参4: 数字替换符.
select mask('xyzABC123', 'X', '小'); -- xxx小小小nnn
-- 4. 只脱敏前几个字符.
select mask_first_n('ABCabc123', 4); -- XXXxbc123 只处理前 4 个字符.
select mask_show_first_n('ABCabc123', 4); -- ABCaxxnnn 除了前 4 个字符, 其它都处理.
-- 5. 需求: 把13112345678 => 131****5678
select concat(substr('13112345678', 1, 3), mask(substr('13112345678', 4, 4), 'X', 'x', '*'), substr('13112345678', -4));
-- 6. sort_array()函数, 对数组进行排序, 属于: 集合函数.
select sort_array(array(11, 33, 22, 55)); -- [11,22,33,55]
其它函数
-- 1. 查看当前的用户
select current_user(); -- root
-- 2. 查看当前在使用的数据库.
select current_database();
-- 3. 查看当前的hive版本.
select version(); -- 3.1.2 r8190d2be7b7165effa62bd21b7d60ef81fb0e4af