Hive数仓操作(十一)
一、Hive 日期函数
在日常的数据处理工作中,日期和时间的处理是非常常见的操作。Hive 提供了丰富的日期函数,能够帮助我们方便地进行日期和时间的计算。本文将详细介绍 Hive 中常用的日期函数,并通过具体的示例展示其用法和结果。
1. 获取当前时间
获取包含毫秒的当前时间
SELECT current_timestamp();
示例结果:
2024-10-01 12:34:56.789
获取当前日期
SELECT current_date();
示例结果:
2024-10-01
2. Unix 时间戳处理
获取当前 Unix 时间戳
SELECT unix_timestamp();
示例结果:
1727801696
解释:Unix 时间戳是自1970年1月1日(UTC)以来的秒数
将 Unix 时间戳转换为日期时间
SELECT from_unixtime(1727801696);
示例结果:
2024-10-01 12:34:56
3. 日期计算
日期加减天数
在指定的日期上增加或减少天数。
SELECT date_add(current_date(), 2);
示例结果:
2024-10-03
日期加减月份
在指定的日期上增加或减少月份。
SELECT add_months(current_date(), 1);
示例结果:
2024-11-01
4. 获取指定日期的特殊日期
获取指定日期所在月份的最后一天
SELECT last_day(current_date());
示例结果:
2024-10-31
获取指定日期的下一个星期几
第二个参数决定了返回的星期几,例如 'MO'
表示星期一。
SELECT next_day(current_date(), 'MO');
示例结果:
2024-10-07
5. 日期差计算
计算两个日期之间相差的天数
SELECT datediff(current_date(), to_date('2020-10-08'));
示例结果:
1454
计算两个日期之间相差的月数
SELECT months_between(current_timestamp(), to_date('2022-10-08'));
示例结果:
24.97
6. 日期格式转换
将字符串类型的日期转换为时间戳
SELECT unix_timestamp('2008-08-08', 'yyyy-MM-dd');
示例结果:
1218144000
7. 提取日期中的年、月、日
获取日期中的年、月、日
SELECT year(current_date()), month(current_date()), day(current_date());
示例结果:
2024 10 1
二、Hive 条件函数
1. IF 函数
if(判断条件, x, y)
:当判断条件成立时,返回 x,否则返回 y。
SELECT ename, sal, if(sal > 2500, 'great than 2500', 'less equers 2500') FROM emp;
示例结果:
+-------+------+-------------------+
| ename | sal | result |
+-------+------+-------------------+
| John | 3000 | great than 2500 |
| Jane | 2000 | less equers 2500 |
+-------+------+-------------------+
2. CASE WHEN 函数
CASE WHEN
函数用来根据条件进行分支判断,打标签,并结合聚合函数进行统计,然后以列的方式显示结果。
SELECT ename, sal,
CASE
WHEN sal <= 1000 THEN 'A 级'
WHEN sal <= 2000 THEN 'B 级'
WHEN sal <= 3000 THEN 'C 级'
WHEN sal <= 4000 THEN 'D 级'
ELSE 'E 级'
END as grade
FROM emp;
示例结果:
+-------+------+-------+
| ename | sal | grade |
+-------+------+-------+
| John | 3000 | C 级 |
| Jane | 2000 | B 级 |
+-------+------+-------+
三、Hive 空值处理函数
1. COALESCE 函数
coalesce(a, b, c, ...)
返回参数里第一个不为空的值。
SELECT ename, coalesce(comm, 0) as comm FROM emp;
示例结果( Jane的comm为空值 ):
+-------+------+
| ename | comm |
+-------+------+
| John | 500 |
| Jane | 0 |
+-------+------+
2. NVL 函数
NVL(x, y)
如果 x 不为 NULL,就返回 x,否则返回 y。
SELECT ename, nvl(comm, 0) as comm FROM emp;
示例结果( Jane的comm为空值 ):
+-------+------+
| ename | comm |
+-------+------+
| John | 500 |
| Jane | 0 |
+-------+------+
四、聚合函数
常用的聚合函数有 MAX、SUM、COUNT、MIN、AVG 以及 GROUP BY 和 HAVING 的用法和 Mysql、Oracle 是一样的。
SELECT COUNT(1), MAX(sal), MIN(sal), AVG(sal), SUM(sal) FROM emp;
示例结果:
+---------+----------+----------+----------+----------+
| count(1)| max(sal) | min(sal) | avg(sal) | sum(sal) |
+---------+----------+----------+----------+----------+
| 2 | 3000 | 2000 | 2500 | 5000 |
+---------+----------+----------+----------+----------+
五、类型转换函数
1. array
数组类型转换函数
将不同的元素拼接成一个数组。
SELECT array(1, 2, 3) as num_array, array('a', 'b', 'c') as char_array;
示例结果:
+-----------+-------------+
| num_array | char_array |
+-----------+-------------+
| [1,2,3] | ['a','b','c']|
+-----------+-------------+
2. str_to_map
map类型转换函数
将字符串参数转换成一个 map 类型。
SELECT str_to_map('name:zhangsan,age:20', ',', ':') as info_map;
示例结果:
+-------------------------------+
| info_map |
+-------------------------------+
| {"name":"zhangsan","age":"20"}|
+-------------------------------+
语法:
str_to_map(text, x, y)
text
:包含键值对信息的字符串。x
:键值对之间的分隔符。y
:键和值之间的分隔符。
3. CAST
强制类型转换函数
CAST(x AS 类型)
强制类型转换。
SELECT from_unixtime(CAST('1652271247' AS bigint)) as datetime;
示例结果:
+---------------------+
| datetime |
+---------------------+
| 2022-05-11 03:34:07 |
+---------------------+