Hive数仓操作(十一)

一、Hive 日期函数

在日常的数据处理工作中,日期和时间的处理是非常常见的操作。Hive 提供了丰富的日期函数,能够帮助我们方便地进行日期和时间的计算。本文将详细介绍 Hive 中常用的日期函数,并通过具体的示例展示其用法和结果。

1. 获取当前时间

获取包含毫秒的当前时间

sql 复制代码
SELECT current_timestamp();

示例结果

复制代码
2024-10-01 12:34:56.789

获取当前日期

sql 复制代码
SELECT current_date();

示例结果

复制代码
2024-10-01

2. Unix 时间戳处理

获取当前 Unix 时间戳

sql 复制代码
SELECT unix_timestamp();

示例结果

复制代码
1727801696

解释:Unix 时间戳是自1970年1月1日(UTC)以来的秒数

将 Unix 时间戳转换为日期时间

sql 复制代码
SELECT from_unixtime(1727801696);

示例结果

复制代码
2024-10-01 12:34:56

3. 日期计算

日期加减天数

在指定的日期上增加或减少天数。

sql 复制代码
SELECT date_add(current_date(), 2);

示例结果

复制代码
2024-10-03

日期加减月份

在指定的日期上增加或减少月份。

sql 复制代码
SELECT add_months(current_date(), 1);

示例结果

复制代码
2024-11-01

4. 获取指定日期的特殊日期

获取指定日期所在月份的最后一天

sql 复制代码
SELECT last_day(current_date());

示例结果

复制代码
2024-10-31

获取指定日期的下一个星期几

第二个参数决定了返回的星期几,例如 'MO' 表示星期一。

sql 复制代码
SELECT next_day(current_date(), 'MO');

示例结果

复制代码
2024-10-07

5. 日期差计算

计算两个日期之间相差的天数

sql 复制代码
SELECT datediff(current_date(), to_date('2020-10-08'));

示例结果

复制代码
1454

计算两个日期之间相差的月数

sql 复制代码
SELECT months_between(current_timestamp(), to_date('2022-10-08'));

示例结果

复制代码
24.97

6. 日期格式转换

将字符串类型的日期转换为时间戳

sql 复制代码
SELECT unix_timestamp('2008-08-08', 'yyyy-MM-dd');

示例结果

复制代码
1218144000

7. 提取日期中的年、月、日

获取日期中的年、月、日

sql 复制代码
SELECT year(current_date()), month(current_date()), day(current_date());

示例结果

复制代码
2024    10    1

二、Hive 条件函数

1. IF 函数

if(判断条件, x, y):当判断条件成立时,返回 x,否则返回 y。

sql 复制代码
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 函数用来根据条件进行分支判断,打标签,并结合聚合函数进行统计,然后以列的方式显示结果。

sql 复制代码
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, ...) 返回参数里第一个不为空的值。

sql 复制代码
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。

sql 复制代码
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 是一样的。

sql 复制代码
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 数组类型转换函数

将不同的元素拼接成一个数组。

sql 复制代码
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 类型。

sql 复制代码
SELECT str_to_map('name:zhangsan,age:20', ',', ':') as info_map;

示例结果

复制代码
+-------------------------------+
|           info_map            |
+-------------------------------+
| {"name":"zhangsan","age":"20"}|
+-------------------------------+
语法:
sql 复制代码
str_to_map(text, x, y)
  • text:包含键值对信息的字符串。
  • x:键值对之间的分隔符。
  • y:键和值之间的分隔符。

3. CAST 强制类型转换函数

CAST(x AS 类型) 强制类型转换。

sql 复制代码
SELECT from_unixtime(CAST('1652271247' AS bigint)) as datetime;

示例结果

复制代码
+---------------------+
|      datetime       |
+---------------------+
| 2022-05-11 03:34:07 |
+---------------------+
相关推荐
GreatSQL1 小时前
MySQL迁移至GreatSQL后,timestamp字段插入报错解析
数据库
武子康2 小时前
大数据-101 Spark Streaming 有状态转换详解:窗口操作与状态跟踪实战 附多案例代码
大数据·后端·spark
expect7g2 小时前
COW、MOR、MOW
大数据·数据库·后端
DemonAvenger4 小时前
MySQL海量数据快速导入导出技巧:从实战到优化
数据库·mysql·性能优化
武子康18 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
阿里云大数据AI技术18 小时前
2025云栖大会·大数据AI参会攻略请查收!
大数据·人工智能
薛定谔的算法20 小时前
phoneGPT:构建专业领域的检索增强型智能问答系统
前端·数据库·后端
代码匠心21 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
Databend1 天前
Databend 亮相 RustChinaConf 2025,分享基于 Rust 构建商业化数仓平台的探索
数据库
得物技术1 天前
破解gh-ost变更导致MySQL表膨胀之谜|得物技术
数据库·后端·mysql