文章目录
- 前言
- [一、Hive Operators](#一、Hive Operators)
-
- [(一)Arithmetic Operators](#(一)Arithmetic Operators)
-
- 1.算数操作符介绍
- 2.示例
-
- (1)基础算数运算
- (2)计算总收入 (Total Revenue)
- (3)高价商品折扣计算
- [(4) 使用取模和除法的复杂查询](#(4) 使用取模和除法的复杂查询)
- [(二)Relational Operators](#(二)Relational Operators)
- [(三)Logical Operators](#(三)Logical Operators)
- [(四)Hive String Operators](#(四)Hive String Operators)
- [(五)Operators on Complex Types](#(五)Operators on Complex Types)
- [二、Hive Functions](#二、Hive Functions)
-
- [(一)Mathematical Functions](#(一)Mathematical Functions)
-
- 1.数学函数
- 2.实例
-
- (1)基础价格计算
- [(2)ROUND() 函数 - 四舍五入](#(2)ROUND() 函数 - 四舍五入)
- [(3) BROUND() 函数 - 银行家舍入法](#(3) BROUND() 函数 - 银行家舍入法)
- [(4) RAND() 函数 - 随机折扣](#(4) RAND() 函数 - 随机折扣)
- (5)数学函数综合应用表
- 3.运行结果举例
- [(二)Date Functions](#(二)Date Functions)
-
- 1.日期时间函数
- 2.实例
-
- [(1)UNIX_TIMESTAMP() - 时间戳转换](#(1)UNIX_TIMESTAMP() - 时间戳转换)
- [(2)TO_DATE() - 提取日期部分](#(2)TO_DATE() - 提取日期部分)
- [(3)YEAR() - 提取年份](#(3)YEAR() - 提取年份)
- [(4) QUARTER() - 提取季度](#(4) QUARTER() - 提取季度)
- [(5)DATE_SUB() - 日期减法](#(5)DATE_SUB() - 日期减法)
- [(6)CURRENT_DATE() - 当前日期](#(6)CURRENT_DATE() - 当前日期)
- [(7)LAST_DAY() - 月末日期](#(7)LAST_DAY() - 月末日期)
- [(三)Conditional Functions](#(三)Conditional Functions)
-
- 1.条件函数
- [2.IF() 函数 - 简单二分类](#2.IF() 函数 - 简单二分类)
- [3.CASE 表达式 - 多级分类](#3.CASE 表达式 - 多级分类)
- [4.IF 和 CASE 函数对比](#4.IF 和 CASE 函数对比)
- [(四)String Functions](#(四)String Functions)
- [(五)Built-in Aggregate Functions](#(五)Built-in Aggregate Functions)
- [(六)Built-in Table Generation Function](#(六)Built-in Table Generation Function)
- [(七)Custom Function](#(七)Custom Function)
- [三、Variables in Hive](#三、Variables in Hive)
-
- (一)Hiveconf
- (二)Hivevar
- (三)设置变量
-
- [1.hiveconf 变量设置](#1.hiveconf 变量设置)
- [2.hivevar 变量设置](#2.hivevar 变量设置)
- (四)调用变量
-
- [1.调用 hiveconf 变量](#1.调用 hiveconf 变量)
- [2.调用 hivevar 变量](#2.调用 hivevar 变量)
- (五)对比
- 总结
前言
Hive和其他关系数据库一样,提供了大量的操作符和函数。 函数可以进一步分为内置函数和自定义函数。 Hive功能可以满足各种应用的统计需求。 本章主要介绍Apache Hive中使用的操作符和功能,以及Apache Hive的重要特性。
一、Hive Operators
Apache Hive提供了各种内置操作符,用于在Apache Hive仓库中的表上实现数据操作。 Hive操作符用于对操作数进行数学运算。 它根据应用的逻辑返回特定的值。 Hive操作符大致分为以下几类:
(一)Arithmetic Operators
Hive中的算术运算符支持对操作数进行各种算术运算。 所有返回数字类型。 如果任何操作数为NULL,则结果也是NULL。
Arithmetic Operators in Hive supports various arithmetic operations on the operands. All return number types. If any of the operands are NULL, then the result is also NULL.
1.算数操作符介绍
| Operator | Type | Description |
|---|---|---|
| A+B | 所有数字类型 | 使用 + 操作符进行加法运算。结果值取决于表达式中使用的最大数据类型(largest data type)。 |
| A-B | 所有数字类型 | 使用 - 操作符进行减法运算。结果值取决于表达式中使用的最大数据类型(largest data type)。 |
| A*B | 所有数字类型 | 使用 * 操作符进行乘法运算。结果值取决于表达式中使用的最大数据类型(largest data type)。 |
| A/B | 所有数字类型 | A 除以 B,结果为双精度浮点数(double precision result)。 |
| A%B | 所有数字类型 | 取模运算:结果类型与操作数的共同类型(common types)相关。 |
| A&B | 所有数字类型 | 执行 bitwise AND 操作:当两个位都为 1 时,结果位为 1;否则为 0。 |
| A | B | 所有数字类型 | 执行 bitwise OR 操作:只要任意一个位为 1,结果位即为 1;否则为 0。 |
| A ^ B | 所有数字类型 | 执行 bitwise XOR 操作:当且仅当一个位为 1 时,结果位为 1;否则为 0。 |
| ^A | 所有数字类型 | 执行 bitwise NOT 操作:对表达式进行按位取反(invert)。 |
2.示例
(1)基础算数运算
sql
select 1+9 from table_name limit 5;
-- 从 table_name 表中选择 5 行,每行都显示计算表达式 1+9 的结果(10)
-- 这是一个常量表达式查询,用于测试或简单计算
select 40*5 from table_name limit 5;
-- 同上,显示 40×5=200 的结果
(2)计算总收入 (Total Revenue)
sql
select productname, price * quantity as totalsales
from products p, orders o
where p.productid = o.productid
-- 计算每种产品的总销售额 = 单价 × 数量
-- 使用隐式连接(逗号分隔表名)关联产品和订单表
-- 结果:产品名 | 总销售额
(3)高价商品折扣计算
sql
SELECT productid, productname, price,
price - (price * 0.10) AS price_after_10pct_discount
FROM products
WHERE price > 1000
LIMIT 20;
-- 为价格 > 1000 的商品计算 10% 折扣后的价格
-- 表达式:原价 - (原价 × 0.10) = 原价 × 0.9
-- 显示:产品ID | 产品名 | 原价 | 折扣后价格
(4) 使用取模和除法的复杂查询
sql
SELECT orderid, quantity,
(quantity % 2) AS quantity_mod_2,
CAST(p.price AS DOUBLE) / o.quantity AS price_per_item
FROM orders o
JOIN products p ON o.productid = p.productid
WHERE o.quantity > 0;
-- quantity % 2:计算 quantity 除以 2 的余数,用于判断数量是奇数(1)还是偶数(0)
-- CAST(p.price AS DOUBLE) / o.quantity:
-- CAST(p.price AS DOUBLE):将价格转换为双精度浮点数,确保除法结果为小数
-- / o.quantity:计算每个商品的平均单价(总价 ÷ 数量)
-- WHERE o.quantity > 0:排除数量为0的订单,避免除以0的错误
例子中体现的算数运算符作用如下表所示:
| 运算符 | SQL 中的用途 | 示例中的具体应用 |
|---|---|---|
+ |
加法 | 常量计算 1+9 |
* |
乘法 | 计算总销售额 price * quantity |
- |
减法 | 计算折扣价 price - (price * 0.10) |
* |
乘法(折扣计算) | 计算折扣金额 price * 0.10 |
% |
取模(求余数) | 判断奇数偶数 quantity % 2 |
/ |
除法 | 计算单价 price / quantity |
CAST() |
类型转换 | 确保精确除法 CAST(price AS DOUBLE) |
(二)Relational Operators
像许多编程语言一样,Hive也支持许多关系操作符 。 关系操作符用于比较两个操作数并生成TRUE或FALSE值。 下表描述了关系操作符及其操作:
1.关系操作符表格
| 运算符 | 类型 | 描述 |
|---|---|---|
A = B |
所有基本类型 | 如果 A 等于 B 则返回 TRUE,否则返回 FALSE |
A <> B |
所有基本类型 | 如果 A 不等于 B 则返回 TRUE,否则返回 FALSE。如果 A 或 B 的值为 NULL,结果返回 NULL |
A < B |
所有基本类型 | 如果 A 小于 B 则返回 TRUE,否则返回 FALSE。如果 A 或 B 的值为 NULL,结果返回 NULL |
A <= B |
所有基本类型 | 如果 A 小于或等于 B 则返回 TRUE,否则返回 FALSE。如果 A 或 B 的值为 NULL,结果返回 NULL |
A > B |
所有基本类型 | 如果 A 大于 B 则返回 TRUE,否则返回 FALSE。如果 A 或 B 的值为 NULL,结果返回 NULL |
A >= B |
所有基本类型 | 如果 A 大于或等于 B 则返回 TRUE,否则返回 FALSE。如果 A 或 B 的值为 NULL,结果返回 NULL |
A IS NULL |
所有类型 | 如果 A 是 NULL 则返回 TRUE,否则返回 FALSE |
A IS NOT NULL |
所有类型 | 如果 A 不是 NULL 则返回 TRUE,否则返回 FALSE |
A LIKE B |
字符串 | 字符串 A 与 B 匹配则返回 TRUE,否则返回 FALSE。如果 A 或 B 的值为 NULL,结果返回 NULL。 在 B 字符串中,_ 代表任意单个字符,% 代表任意多个字符 示例 :('foobar' LIKE 'foo') 返回 FALSE ('foobar' LIKE 'foo___') 或 ('foobar' LIKE 'foo%') 返回 TRUE |
A RLIKE B |
字符串 | 如果 A 或 B 的值为 NULL,结果返回 NULL。字符串 A 和 B 通过 Java 正则表达式匹配,匹配则返回 TRUE,否则返回 FALSE 示例 :('foobar' RLIKE 'foo') 返回 FALSE ('foobar' RLIKE '^f.*r$') 返回 TRUE |
A REGEXP B |
字符串 | 与 RLIKE 相同 |
2.实例
(1)查询特定用户订单
sql
SELECT orderid, custid, productid, quantity, orderdate
FROM orders
WHERE custid = 1010;
--WHERE custid = 1010:使用 等于(=)运算符 筛选
--功能:查找客户ID等于1010的所有订单
-- 结果:返回该客户的所有订单详细信息
-- 实际应用场景:查看某位特定客户的所有购买记录
(2)查询低价产品
sql
SELECT productid, productname, price
FROM products
WHERE price <= 500;
-- WHERE price <= 500:使用 小于等于(<=)运算符 筛选
-- 功能:查找价格小于或等于500的所有产品
-- 结果:返回符合条件的产品ID、名称和价格
-- 实际应用场景:筛选低价商品、寻找经济型产品
(3)查询非印度客户
sql
SELECT custid, cust_name, country
FROM customer
WHERE country <> 'India';
-- 使用 不等于(<>)运算符 筛选
-- 功能:查找国家不是"印度"的所有客户
-- 结果:返回非印度客户的ID、姓名和国家
-- 实际应用场景:按地区筛选客户、排除特定国家的客户
(4)查询特定用户订单
sql
SELECT custid, cust_name, country
FROM customer
WHERE cust_name LIKE 'Customer_10%';
-- WHERE cust_name LIKE 'Customer_10%':使用 LIKE运算符 进行模式匹配
-- 模式分析:
-- 'Customer_10%':匹配以"Customer_10"开头的任何客户名
-- %:通配符,代表0个或多个任意字符
-- 功能:查找客户名以"Customer_10"开头的所有客户
-- 可能匹配的示例:
--Customer_101、Customer_1025、Customer_10A
(5)用例逻辑运算符总结
| 运算符 | 查询中的用途 | SQL片段示例 |
|---|---|---|
= |
精确匹配 | custid = 1010 |
<= |
小于等于比较 | price <= 500 |
<> |
不等于比较 | country <> 'India' |
LIKE |
模式匹配 | cust_name LIKE 'Customer_10%' |
(三)Logical Operators
Hive中的逻辑运算符提供了创建逻辑表达式的支持。 根据操作数的布尔值,All返回布尔TRUE、FALSE或NULL。 在这种情况下,NULL作为一个"未知"标志,所以如果结果取决于未知的状态,那么结果本身就是未知的。
1.逻辑运算符表格
| 运算符 | 类型 | 描述 |
|---|---|---|
| A AND B | 布尔型 | 如果 A 和 B 都是 TRUE,则返回 TRUE。否则返回 FALSE。如果 A 或 B 是 NULL,则返回 NULL |
| A && B | 布尔型 | 与 A AND B 相同 |
| A OR B | 布尔型 | 如果 A 或 B 是 TRUE,则返回 TRUE,否则返回 FALSE。如果 A 和 B 都是 NULL,则返回 NULL |
| A || B | 布尔型 | 与 A OR B 相同 |
| NOT A | 布尔型 | 如果 A 是 NULL 或 FALSE,则返回 TRUE,否则返回 FALSE |
| ! A | 布尔型 | 与 NOT A 相同 |
2.实例
(1)查询2023年高价产品订单
sql
SELECT o.orderid, o.custsid, o.productid, o.quantity, o.orderdate
FROM orders o
JOIN products p ON o.productid = p.productid
WHERE year(o.orderdate) = 2023 AND p.price > 1000;
-- 逻辑运算符:AND(同时满足两个条件)
-- 函数使用:year(o.orderdate) = 2023 - 使用 year() 函数提取订单日期的年份
-- 实际业务场景:查找2023年并且产品价格超过1000元的所有订单
-- 查询结果:返回符合条件的订单ID、客户ID、产品ID、数量和订单日期
(2)查询英国或德国客户
sql
SELECT custid, cust_name, country
FROM customer
WHERE country = 'UK' OR country = 'Germany';
-- 逻辑运算符:OR(满足其中一个条件即可)
-- 实际业务场景:筛选出来自英国或德国的所有客户
-- 查询结果:返回客户ID、客户名称和国家信息
(3)查询非高价产品
sql
SELECT productid, productname, price
FROM products
WHERE NOT (price > 1500);
-- 逻辑运算符:NOT(取反操作)
-- 实际业务场景:查找价格不超过1500元的产品
-- 等价写法:WHERE price <= 1500
-- 查询结果:返回产品ID、产品名称和价格
(4)总结及注意事项
| 运算符 | 功能描述 | 实际应用场景 |
|---|---|---|
AND |
同时满足所有条件 | 多条件筛选,如"特定年份且高价产品" |
OR |
满足至少一个条件 | 多选一筛选,如"A国家或B国家客户" |
NOT |
取反条件 | 排除特定条件,如"非高价产品" |
- 运算符优先级 :
NOT > AND > OR。使用括号可以明确优先级:(A OR B) AND C 与 A OR (B AND C)结果不同 - 性能考虑:使用索引字段作为条件(如日期、ID)避免在WHERE子句中对字段进行函数操作,可能影响索引使用
(四)Hive String Operators
1.字符串连接运算符
| 运算符 | 类型 | 描述 |
|---|---|---|
| A || B | 字符串 | 连接操作数,相当于 concat(A, B) |
2.实例
(1)为印度客户添加"_VIP"标签
sql
SELECT custid,
CONCAT(cust_name, '_VIP') AS vip_name,
country
FROM customer
WHERE country = 'India';
-
CONCAT(cust_name, '_VIP'):使用CONCAT()函数将客户姓名和字符串 '_VIP' 连接起来 -
AS vip_name:将连接后的结果命名为vip_name 列 -
WHERE country = 'India':只筛选出来自印度的客户
(2)将国家和客户姓名合并为一列
sql
SELECT custid,
cust_name || ' - ' || country AS full_info
FROM customer;
- || 运算符 :字符串连接运算符,等同于
CONCAT() cust_name || ' - ' || country:将客户姓名、分隔符" - "和国家连接成一个字符串AS full_info:将连接后的完整信息命名为full_info列
(3)总结
| 方法 | 语法 | 特点 | 适用场景 |
|---|---|---|---|
CONCAT() 函数 |
CONCAT(str1, str2, ...) |
标准SQL函数,可连接多个参数 | 需要连接多个字符串时 |
| 运算符 | str1 str2 | 更简洁,但某些数据库不支持 | 简单的字符串连接 |
(五)Operators on Complex Types
1.字符串连接运算符
| 运算符 | 类型 | 描述 |
|---|---|---|
| A[n] | A 是数组,n 是整数 | 返回数组 A 中第 n 个元素 。第一个元素的索引为 0 |
| M[key] | M 是 Map<K, V>,key 的类型是 K |
返回映射中对应 key 的值 |
| S.x | S 是结构体 | 返回结构体 S 的 x 字段 |
2.实例
(1)创建表
sql
CREATE TABLE customer_orders (
custid INT,
orders ARRAY<INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':';
-
ARRAY<INT>:定义orders字段为整数数组类型 -
ROW FORMAT DELIMITED:指定行格式为分隔符格式 -
FIELDS TERMINATED BY ',':字段之间用逗号分隔 -
COLLECTION ITEMS TERMINATED BY ':':数组元素之间用冒号分隔
创建的表结构:
| 列名 | 数据类型 | 描述 |
|---|---|---|
| custid | INT | 客户ID |
| orders | ARRAY | 订单ID数组 |
(2)数据文件示例
| custid | orders 数组内容 | 数组元素个数 |
|---|---|---|
| 1001 | [1, 2, 3] | 3 |
| 1002 | [4, 5] | 2 |
| 1003 | [6, 7, 8, 9] | 4 |
| 1004 | [10, 11] | 2 |
| 1005 | [12, 13, 14] | 3 |
(3)加载数据到Hive表
sql
LOAD DATA INPATH '/Data/customer_orders.txt'
INTO TABLE customer_orders;
- 将HDFS上的文件加载到Hive表中
- 文件路径:/Data/customer_orders.txt
- 数据根据表定义的分隔符自动解析
(4)查询示例一:访问数组元素
sql
SELECT custid, orders[0] AS first_order
FROM customer_orders;
orders[0]:访问数组的第一个元素(索引从0开始)AS first_order:将结果列命名为first_order
查询结果:
| custid | first_order |
|---|---|
| 1001 | 1 |
| 1002 | 4 |
| 1003 | 6 |
| 1004 | 10 |
| 1005 | 12 |
(5)查询示例二:检查数组是否包含特定值
sql
SELECT custid
FROM customer_orders
WHERE array_contains(orders, 7);
array_contains(orders, 7):检查 orders 数组是否包含值 7- 这是一个布尔条件,返回 TRUE 或 FALSE
查询结果:只有客户 1003 的订单数组 [6, 7, 8, 9] 包含值 7
| custid |
|---|
| 1003 |
(6)数组操作的实用函数
sql
-- 获取数组大小
SELECT custid, size(orders) AS order_count
FROM customer_orders;
-- 展开数组为多行(行转列)
SELECT custid, order_id
FROM customer_orders
LATERAL VIEW explode(orders) exploded_table AS order_id;
-- 连接数组元素为字符串
SELECT custid, concat_ws(',', orders) AS orders_string
FROM customer_orders;
二、Hive Functions
(一)Mathematical Functions
1.数学函数
| 函数名 | 返回类型 | 描述 |
|---|---|---|
round(DOUBLE X) |
DOUBLE | 获取并返回 X 的四舍五入后的 BIGINT 值(取整) |
round(DOUBLE X, INT d) |
DOUBLE | 获取并返回 X 保留 d 位小数的四舍五入结果 |
bround(DOUBLE X) |
DOUBLE | 获取并返回 X 的四舍六入五成双(HALF_EVEN) 取整结果 |
floor(DOUBLE X) |
BIGINT | 获取并返回小于或等于 X 的最大整数 |
ceil(DOUBLE a), ceiling(DOUBLE a) |
BIGINT | 获取并返回大于或等于 X 的最小整数 |
rand(), rand(INT seed) |
DOUBLE | 获取并返回一个均匀分布在 0 到 1 之间的随机数,seed 为随机种子 |
2.实例
(1)基础价格计算
sql
SELECT productname, price*3.14 FROM products p;
price*3.14:将每个产品的价格乘以 3.14- 结果示例
| productname | price*3.14 |
|---|---|
| 笔记本电脑 | 3140.00 |
| 鼠标 | 31.40 |
| 键盘 | 62.80 |
(2)ROUND() 函数 - 四舍五入
sql
SELECT productname, round(price*3.14, 1) FROM products p;
round(price*3.14, 1):将 price*3.14 的结果四舍五入到1位小数,参数 1 表示保留1位小数
| 原始值 | round(x, 1) 结果 | 说明 |
|---|---|---|
| 31.45 | 31.5 | 5向上舍入 |
| 31.44 | 31.4 | 4向下舍入 |
| 31.40 | 31.4 | 末尾0保留 |
(3) BROUND() 函数 - 银行家舍入法
sql
SELECT productname, price*3.14, bround(price*3.14) FROM products p;
bround(price*3.14):使用银行家舍入法(HALF_EVEN)取整- 当小数部分正好是0.5时,舍入到最近的偶数
- 四舍五入 vs 银行家舍入对比:
| 原始值 | round() 结果 | bround() 结果 | 说明 |
|---|---|---|---|
| 31.5 | 32 | 32 | 舍入到偶数 |
| 32.5 | 33 | 32 | 舍入到偶数 |
| 31.4 | 31 | 31 | 正常舍入 |
| 31.6 | 32 | 32 | 正常舍入 |
查询结果示例:
| productname | 价格×3.14 | bround结果 |
|---|---|---|
| 笔记本电脑 | 3140.0 | 3140 |
| 鼠标 | 31.4 | 31 |
| 键盘 | 62.8 | 63 |
(4) RAND() 函数 - 随机折扣
sql
SELECT price, rand() AS discount FROM products p;
rand():生成一个0到1之间的随机数AS discount:将随机数命名为discount列
示例:
| 原始价格 | rand() 随机数 | 实际折扣价格计算 |
|---|---|---|
| 1000 | 0.15 | 1000 × 0.15 = 150 |
| 500 | 0.75 | 500 × 0.75 = 375 |
| 200 | 0.30 | 200 × 0.30 = 60 |
(5)数学函数综合应用表
| 函数名 | 语法示例 | 功能描述 | 实际应用场景 |
|---|---|---|---|
| 乘法 | price*3.14 |
数值相乘 | 汇率转换、增值税计算 |
| ROUND() | round(price, 1) |
四舍五入到指定小数位 | 价格精确化、财务报告 |
| BROUND() | bround(price) |
银行家舍入法取整 | 财务计算、统计分析 |
| RAND() | rand() |
生成0-1随机数 | 随机折扣、抽奖、A/B测试 |
3.运行结果举例

(二)Date Functions
1.日期时间函数
| 函数名 | 返回类型 | 描述 |
|---|---|---|
Unix_Timestamp() |
BIGINT | 获取当前 Unix 时间戳(秒数) |
To_date(string timestamp) |
STRING | 提取并返回时间戳字符串的日期部分 |
year(string date) |
INT | 提取并返回日期或时间戳字符串的年份部分 |
quarter(date/timestamp/string) |
INT | 提取并返回日期、时间戳或字符串的季度(1-4) |
month(string date) |
INT | 提取并返回日期或时间戳字符串的月份部分 |
hour(string date) |
INT | 提取并返回时间戳的小时部分 |
minute(string date) |
INT | 提取并返回时间戳的分钟部分 |
Date_sub(string starting date, int days) |
STRING | 计算起始日期减去指定天数后的日期 |
Current_date |
DATE | 获取查询执行开始时的当前日期 |
LAST_day(string date) |
STRING | 获取指定日期所在月份的最后一天 |
trunc(string date, string format) |
STRING | 将日期截断到指定格式单位(如年、月等) |
2.实例
(1)UNIX_TIMESTAMP() - 时间戳转换
sql
SELECT unix_timestamp('2024-11-05', 'yyyy-MM-dd') AS timestamp_value;
- 功能:将日期字符串转换为UNIX时间戳(从1970年1月1日以来的秒数)
- 第一个参数 :日期字符串
'2024-11-05' - 第二个参数 :日期格式
'yyyy-MM-dd'
(2)TO_DATE() - 提取日期部分
sql
SELECT to_date('2024-11-05 10:30:45') AS only_date;
- 功能:从完整的时间戳字符串中提取日期部分(去掉时间)
- 参数 :时间戳字符串
'2024-11-05 10:30:45' - 返回值 :
2024-11-05
(3)YEAR() - 提取年份
sql
SELECT year(orderdate) AS order_year FROM orders;
- 功能 :提取日期字段中的年份
- 参数 :日期字段
orderdate - 返回值 :年份整数,如 2024
查询结果示例:
| orderid | orderdate | order_year |
|---|---|---|
| 1001 | 2024-03-15 | 2024 |
| 1002 | 2023-11-20 | 2023 |
| 1003 | 2024-01-05 | 2024 |
(4) QUARTER() - 提取季度
sql
SELECT quarter(orderdate) AS quarter_value FROM orders;
- 功能:提取日期所在的季度(1-4)
- 参数 :日期字段
orderdate - 返回值 :季度整数
(1=1-3月, 2=4-6月, 3=7-9月, 4=10-12月)
(5)DATE_SUB() - 日期减法
sql
SELECT orderdate, date_sub(orderdate, 7) AS one_week_before FROM orders;
- 功能:从指定日期减去指定的天数
- 第一个参数 :基准日期
orderdate - 第二个参数:要减去的天数 7
- 返回值:减去指定天数后的日期
(6)CURRENT_DATE() - 当前日期
sql
SELECT current_date();
- 功能:返回当前系统日期
- 参数:无
- 返回值 :当前日期,如
2024-11-05
(7)LAST_DAY() - 月末日期
sql
SELECT last_day(orderdate) AS last_day_of_month FROM orders;
- 功能:返回指定日期所在月份的最后一天
- 参数 :日期字段
orderdate - 返回值:月份最后一天的日期
运行结果:
| orderdate | last_day_of_month |
|---|---|
| 2024-02-15 | 2024-02-29 |
| 2024-03-10 | 2024-03-31 |
| 2024-04-25 | 2024-04-30 |
(三)Conditional Functions
HIVE支持IF、CASE、COALESCE、NVL、DECODE等条件函数。 这些函数用于测试相等性、执行比较和检查value是否为空。
1.条件函数
| 函数名 | 返回类型 | 描述 |
|---|---|---|
if(Boolean testCondition, T valueTrue, T valueFalseOrNull) |
T | 条件判断:如果 testCondition 为 true,则返回 valueTrue;否则返回 valueFalseOrNull |
ISNULL(X) |
BOOLEAN | 判断 X 是否为 NULL,是则返回 true,否则返回 false |
ISNOTNULL(X) |
BOOLEAN | 判断 X 是否不为 NULL,是则返回 true,否则返回 false |
| 函数名 | 语法示例 | 功能描述 | 适用场景 |
|---|---|---|---|
| IF() | IF(condition, value_if_true, value_if_false) |
简单条件判断,返回两个值中的一个 | 二分类场景、简单条件判断 |
| CASE | CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default END |
多条件判断,返回多个可能值中的一个 | 多分类场景、复杂条件逻辑 |
2.IF() 函数 - 简单二分类
sql
SELECT productid, productname, price,
IF(price > 1200, 'Expensive', 'Cheap') AS price_label
FROM products;
- 功能:根据价格是否大于1200,将产品分为"昂贵"或"便宜"
- IF 函数结构:
- 条件:
price > 1200 - 条件为真:
返回 'Expensive' - 条件为假:
返回 'Cheap'
示例结果:
| productid | productname | price | price_label |
|---|---|---|---|
| 1001 | 笔记本电脑 | 1500 | Expensive |
| 1002 | 鼠标 | 50 | Cheap |
| 1003 | 键盘 | 800 | Cheap |
| 1004 | 显示器 | 1300 | Expensive |
| 1005 | 耳机 | 300 | Cheap |
3.CASE 表达式 - 多级分类
sql
SELECT productid, productname, price,
CASE
WHEN price >= 1500 THEN 'Tier A - 20% off'
WHEN price >= 800 THEN 'Tier B - 10% off'
ELSE 'Tier C - no discount'
END AS discount_tier
FROM products;
- 功能:根据价格范围将产品分为三个折扣等级
- CASE 结构:
- 第一个条件:price >= 1500 → 'Tier A - 20% off'
- 第二个条件:price >= 800 → 'Tier B - 10% off'
- 其他情况:'Tier C - no discount'
4.IF 和 CASE 函数对比
| 特性 | IF() 函数 | CASE 表达式 |
|---|---|---|
| 语法复杂度 | 简单 | 较复杂 |
| 条件数量 | 仅支持1个条件 | 支持多个WHEN条件 |
| 返回值数量 | 2个(真/假) | 多个(每个WHEN一个,加ELSE) |
| 可读性 | 简单条件时更好 | 复杂条件时更好 |
| 性能 | 通常相同 | 通常相同 |
| 适用场景 | 二分类、简单逻辑 | 多分类、复杂逻辑 |
(四)String Functions
1.字符串函数
字符串是一个字符序列。 在hive中,字符串函数用于执行不同的操作, 如反转字符串,将字符串转换为大写和小写,连接字符串等等。 Hive字符串函数看起来像SQL和Java字符串函数。 下表总结了字符串函数和相关操作:
String is a sequence of characters. In hive, string functions are used to perform different operations like reversing sting, converting string into upper and lower case, concatenating strings and many more. Hive string functions looks alike SQL and Java string functions. Table below summarizes string functions and related operations:
| 函数名 | 返回类型 | 描述 |
|---|---|---|
reverse(string X) |
string | 获取并返回字符串 X 的反转字符串 |
rpad(string str, int length, string pad) |
string | 获取并返回 右填充字符串:将字符串 str 用 pad 从右侧填充到指定长度 length |
rtrim(string X) |
string | 获取并返回 右侧修剪后的字符串 :移除字符串 X 末尾(右侧)的空格 示例 :rtrim(' results ') 返回 ' results' |
space(INT n) |
string | 获取并返回 n 个空格组成的字符串 |
split(STRING str, STRING pat) |
array | 使用正则表达式 pat 将字符串 str 分割成数组 |
Str_to_map(text[, delimiter1, delimiter2]) |
map<String, String> | 使用两个分隔符将文本分割为键值对映射 |
2.实例
(1)REVERSE() 函数 - 字符串反转
sql
SELECT reverse(cust_name) FROM customer;
- 功能:将客户姓名字符串完全反转
- 参数 :
cust_name- 要反转的字符串 - 返回值:反转后的字符串
示例结果:
| cust_name | reverse(cust_name) |
|---|---|
| John | nhoJ |
| Alice | ecilA |
| Robert | treboR |
| Sophia | aihpoS |
(2)RPAD() 函数 - 右侧填充
sql
SELECT rpad(cust_name, 10, '*') AS result FROM customer;
- 功能:将字符串右侧填充到指定长度
- 参数 :
cust_name:原始字符串 - 10:目标长度
- '*':填充字符
- **返回值:**填充后的字符串,如果
原字符串长度≥目标长度,则不填充直接返回
示例结果:
| 原始字符串 | 目标长度 | 填充字符 | 结果 | 说明 |
|---|---|---|---|---|
| 'John' | 10 | '*' | 'John******' | 右侧填充6个* |
| 'Alice' | 10 | '*' | 'Alice*****' | 右侧填充5个* |
| 'Robert' | 10 | '*' | 'Robert****' | 右侧填充4个* |
| 'Sophia' | 10 | '*' | 'Sophia****' | 右侧填充4个* |
| 'Christopher' | 10 | '*' | 'Christopher' | 原始长度已≥10,不填充 |
(3)SPLIT() 函数 - 字符串分割
sql
SELECT productid, productname,
split(productname, '_') AS name_parts
FROM products;
- 功能:按指定分隔符将字符串分割成数组
- 参数 :
productname:要分割的字符串 - '_':分隔符(可以是正则表达式)
- 返回值:字符串数组
| productid | productname | name_parts (数组) |
|---|---|---|
| 1001 | Laptop_Dell_XPS | ["Laptop", "Dell", "XPS"] |
| 1002 | Mouse_Logitech_MX | ["Mouse", "Logitech", "MX"] |
| 1003 | Keyboard_Cherry_MX | ["Keyboard", "Cherry", "MX"] |
| 1004 | Monitor_Samsung_27inch | ["Monitor", "Samsung", "27inch"] |
3.总结

(五)Built-in Aggregate Functions
1.聚合函数
聚合函数通常用于算术表达式。 聚合函数对一组值进行操作并返回单个数值。 聚合函数从多个输入行计算单个结果。 例如,有用于计算一组行的count、sum、avg、max和min的聚合。 下表总结了不同的聚合函数和相关操作:
Aggregate functions are typically used in arithmetic expressions. Aggregate functions operate on a group of values and return a single numeric value. An aggregate function computes a single result from multiple input rows.
For example, there are aggregates to compute the count, sum, avg, max and min over a set of rows. Table below summarizes different aggregate functions and related operations:
| 函数名 | 返回类型 | 描述 |
|---|---|---|
count(*), count(expr) |
BIGINT | 计数功能 :count(*) 返回检索到的总行数;count(expr) 返回指定表达式非空的行数 |
sum(col), sum(DISTINCT col) |
DOUBLE | 求和功能:返回组中元素的总和,或组中列的不同值的总和 |
avg(col), avg(DISTINCT col) |
DOUBLE | 平均值功能:返回组中元素的平均值,或组中列的不同值的平均值 |
min(col) |
DOUBLE | 最小值功能:返回组中列的最小值 |
max(col) |
DOUBLE | 最大值功能:返回组中列的最大值 |
2.实例
(1)COUNT(*) - 统计总行数
sql
SELECT COUNT(*) FROM customer;
-- 统计特定列的非NULL值数量
SELECT COUNT(cust_id) FROM customer;
-- 统计唯一值数量
SELECT COUNT(DISTINCT country) FROM customer;
-- 结合条件统计
SELECT COUNT(*) FROM customer WHERE registration_date >= '2024-01-01';
- 功能:统计customer表中的总记录数(行数)
COUNT(*):统计所有行,包括那些所有列都是NULL的行- 返回值:一个整数,表示表中的总客户数
(2)SUM() - 计算总和
sql
SELECT SUM(price) FROM products;
-- 计算带条件的总和
SELECT SUM(price) FROM products WHERE category = 'Electronics';
-- 计算表达式结果的总和
SELECT SUM(price * quantity) FROM products;
-- 计算不同值的总和
SELECT SUM(DISTINCT price) FROM products;
- 功能:计算products表中所有产品价格的总和
- SUM(price):对price列的所有非NULL值求和
- 返回值:所有产品价格的总和
(3)AVG() - 计算平均值
sql
SELECT AVG(price) FROM products;
-- 计算带条件的平均值
SELECT AVG(price) FROM products WHERE price > 100;
-- 计算不同值的平均值
SELECT AVG(DISTINCT price) FROM products;
-- 保留小数位数
SELECT ROUND(AVG(price), 2) FROM products;
- 功能:计算products表中所有产品的平均价格
AVG(price):计算price列所有非NULL值的平均值- 返回值:产品的平均价格
(4)MIN() - 查找最小值
sql
SELECT MIN(price) FROM products;
-- 查找最早日期
SELECT MIN(order_date) FROM orders;
-- 结合分组使用
SELECT category, MIN(price) FROM products GROUP BY category;
-- 查找最小值及其相关信息
SELECT product_name, price
FROM products
WHERE price = (SELECT MIN(price) FROM products);
- 功能:查找价格列的最小值
MIN(price):返回price列中的最小值- 返回值:最低价格
(5)MAX() - 查找最大值
sql
SELECT MAX(price) FROM products;
-- 查找最新日期
SELECT MAX(order_date) FROM orders;
-- 结合分组使用
SELECT category, MAX(price) FROM products GROUP BY category;
-- 查找最大值及其相关信息
SELECT product_name, price
FROM products
WHERE price = (SELECT MAX(price) FROM products);
- 功能:查找价格列的最大值
MAX(price):返回price列中的最大值- 返回值:最高价格
(六)Built-in Table Generation Function
UDTF是一个用户定义的表生成函数,它在单行上操作,并在表中产生多行作为输出:
| 函数名 | 返回类型 | 描述 |
|---|---|---|
explode(ARRAY) |
N rows | 数组展开:返回 n 行数据,其中 n 是数组的大小。此函数将数组的每个元素表示为单独的一行 |
explode(MAP) |
N rows | 映射展开:返回 n 行数据,其中 n 是映射的大小。此函数将映射的每个键值对表示为一行,包含两列:一列为键,另一列为值 |
inline(ARRAY<STRUCT[,STRUCT]>) |
多行 | 结构体数组展开:将结构体数组展开为表格形式,每个结构体成为一行,结构体中的字段成为列 |
json_tuple(jsonStr, k1, k2, ...) |
tuple | JSON解析 :接收一个JSON字符串和一组键名,返回对应值的元组。这是 get_json_object UDF 的更高效版本,因为一次调用可以获取多个键 |
(七)Custom Function
1.UDF (User-Defined Function)
该操作应用于单个数据线,产生一条数据线作为输出。 (数学函数,字符串函数)。
The operation is applied to a single data line, producing a data line as output. (Mathematical functions, string functions).
2.UDAF (User-Defined Aggregate Function)
接收多个输入数据行并产生一个输出数据行。 (max计数)
Receives multiple input data rows and produces one
output data row. (count, max)
3.UDTF (User-Defined Table-Generating Function)
该操作作用于单个数据行,并产生多个数据行------一个表作为输出。
The operation acts on a single data row and produces multiple data rows-a table as output.
4.对比及适用条件
| 类型 | 描述 | 输入/输出特点 | 典型应用场景 |
|---|---|---|---|
| Simple UDF (简单UDF) | 用于单行标量转换 。继承 org.apache.hadoop.hive.ql.exec.UDF 类。 |
输入:单行 输出:单行 (一进一出,One-to-One) | 适用于简单的标量操作,类型固定。例如:字符串格式化、数值计算、类型转换等。 |
| UDAF (用户自定义聚合函数) | 用于实现类似 SUM、AVG 的聚合逻辑,跨多行数据进行计算。 | 输入:多行 输出:单行 (多进一出,Many-to-One) | 适用于跨行的聚合计算。例如:自定义的总计、平均值、最大值/最小值、统计等。 |
| UDTF (用户自定义表生成函数) | 将单行输入展开为多行或多列 。通常继承 GenericUDTF。 |
输入:单行 输出:多行 (0...N行) (一进多出,One-to-Many) | 适用于数据扩展或炸裂。例如:将字符串按分隔符拆分成多行、将数组/Map展开等。 |
何时选用:
| 函数类型 | 选用时机 |
|---|---|
| UDF | 需要进行简单的、逐行的标量转换,且输入输出类型固定时。 |
| UDAF | 需要像 SUM、AVG 那样跨行聚合数据,实现自定义的聚合逻辑时。 |
| UDTF | 需要将一行数据扩展成多行 (或同时生成多列)时,例如 EXPLODE 功能。 |
三、Variables in Hive
Hive中的变量与其他编程语言中的变量行为相同。 变量是可变的,而不是固定的值 。 我们可以在程序执行期间将值传递给变量。
Variables in Hive behave same as in other programming languages. Variables are values that are changeable and not fixed. We can pass a value to a variable during the execution of program.
(一)Hiveconf
- hiveconf - 配置变量(主要用于Hive配置参数)
(二)Hivevar
- hivevar - 用户自定义变量(主要用于查询中的参数替换)
(三)设置变量
1.hiveconf 变量设置
在Hive会话中,使用 set 命令设置变量:
sql
-- 方式1:直接设置(默认为hiveconf类型)
set emp_id = 90;
-- 方式2:显式指定hiveconf前缀
set hiveconf:price = 100;
2.hivevar 变量设置
sql
-- 必须显式指定hivevar前缀
set hivevar:deptnum = 20;
(四)调用变量
1.调用 hiveconf 变量
sql
-- 必须使用完整前缀 ${hiveconf:variable_name}
select * from EMP where emp_id = ${hiveconf:emp_id};
2.调用 hivevar 变量
sql
-- 必须使用完整前缀 ${hiveconf:variable_name}
select * from EMP where emp_id = ${hiveconf:emp_id};
(五)对比
-
hivevar: 支持带前缀和不带前缀两种调用方式
-
hiveconf: 必须使用完整前缀 ${hiveconf:...},否则会报错
总结
Hive和其他关系数据库一样,提供了大量的操作符和函数。函数可以进一步分为内置函数和自定义函数。Hive功能可以满足各种应用的统计需求。本章主要介绍Apache Hive中使用的操作符和功能,以及Apache Hive的重要特性。OperatorTypeA+B所有数字类型使用 + 操作符进行加法运算。结果值取决于表达式中使用的最大数据类型(largest data type)。A-B所有数字类型使用 - 操作符进行减法运算。