在Hive中,函数是进行数据处理和分析的关键工具。熟练掌握常用函数能够极大提升数据查询和操作的效率。本文将详细汇总并解析Hive中常用的函数,涵盖字符串函数、日期函数、数学函数、聚合函数等多个类别,帮助开发者高效利用Hive进行数据处理。📊
📌 Hive常用函数分类概览
Hive函数主要分为以下几类,每类函数在不同的场景下发挥重要作用:
函数类别 | 功能描述 | 常用函数 |
---|---|---|
字符串函数 | 处理和操作字符串数据 | CONCAT ,SUBSTR ,LENGTH ,REPLACE |
日期函数 | 处理和操作日期及时间数据 | CURRENT_DATE ,DATE_FORMAT ,DATEDIFF |
数学函数 | 执行数学计算和操作 | ROUND ,CEIL ,FLOOR ,ABS |
聚合函数 | 对一组数据进行汇总计算 | COUNT ,SUM ,AVG ,MAX ,MIN |
条件函数 | 基于条件进行数据处理 | IF ,CASE ,COALESCE |
其他函数 | 其他常用的辅助函数 | CAST ,NVL ,REGEXP |
📝 字符串函数详解
字符串函数用于对文本数据进行操作和处理,常见的字符串函数包括拼接、截取、长度计算、替换等。
🔍 常用字符串函数
函数名称 | 描述 | 示例 |
---|---|---|
CONCAT | 拼接两个或多个字符串 | CONCAT('Hello', ' ', 'World') →Hello World |
SUBSTR | 从字符串中截取子串 | SUBSTR('HiveFunction', 1, 4) →Hive |
LENGTH | 返回字符串的长度 | LENGTH('Hive') →4 |
REPLACE | 替换字符串中的指定部分 | REPLACE('Hello World', 'World', 'Hive') →Hello Hive |
🛠 使用示例
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
SUBSTR(email, 1, 5) AS email_prefix,
LENGTH(phone_number) AS phone_length,
REPLACE(address, 'Street', 'St.') AS short_address
FROM users;
🧐 代码解析
拼接姓名:
CONCAT(first_name, ' ', last_name) AS full_name
将
first_name
和last_name
通过空格拼接成full_name
。截取邮箱前缀:
SUBSTR(email, 1, 5) AS email_prefix
从
email
字段的第1个字符开始,截取5个字符作为email_prefix
。计算电话号码长度:
LENGTH(phone_number) AS phone_length
计算
phone_number
字段的字符长度。替换地址中的“Street”:
REPLACE(address, 'Street', 'St.') AS short_address
将
address
字段中的“Street”替换为“St.”,生成short_address
。
📝 日期函数详解
日期函数用于处理日期和时间数据,常用于时间序列分析和报表生成。
🔍 常用日期函数
函数名称 | 描述 | 示例 |
---|---|---|
CURRENT_DATE | 返回当前日期 | SELECT CURRENT_DATE →2024-04-27 |
DATE_FORMAT | 按指定格式格式化日期 | DATE_FORMAT('2024-04-27', 'yyyy/MM/dd') →2024/04/27 |
DATEDIFF | 计算两个日期之间的天数差 | DATEDIFF('2024-05-01', '2024-04-27') →4 |
YEAR | 提取日期中的年份 | YEAR('2024-04-27') →2024 |
MONTH | 提取日期中的月份 | MONTH('2024-04-27') →4 |
DAY | 提取日期中的天数 | DAY('2024-04-27') →27 |
🛠 使用示例
SELECT
CURRENT_DATE AS today,
DATE_FORMAT(order_date, 'yyyy/MM/dd') AS formatted_date,
DATEDIFF(delivery_date, order_date) AS delivery_days,
YEAR(order_date) AS order_year,
MONTH(order_date) AS order_month,
DAY(order_date) AS order_day
FROM orders;
🧐 代码解析
获取当前日期:
CURRENT_DATE AS today
返回当前日期,并命名为
today
。格式化订单日期:
DATE_FORMAT(order_date, 'yyyy/MM/dd') AS formatted_date
将
order_date
按照yyyy/MM/dd
格式进行格式化,命名为formatted_date
。计算交付天数:
DATEDIFF(delivery_date, order_date) AS delivery_days
计算
delivery_date
与order_date
之间的天数差,命名为delivery_days
。提取年份、月份和天数:
YEAR(order_date) AS order_year, MONTH(order_date) AS order_month, DAY(order_date) AS order_day
分别提取
order_date
中的年份、月份和天数,命名为order_year
、order_month
和order_day
。
📝 数学函数详解
数学函数用于执行各种数学计算和操作,适用于数据分析和统计计算。
🔍 常用数学函数
函数名称 | 描述 | 示例 |
---|---|---|
ROUND | 对数值进行四舍五入 | ROUND(3.14159, 2) →3.14 |
CEIL | 向上取整 | CEIL(3.14) →4 |
FLOOR | 向下取整 | FLOOR(3.99) →3 |
ABS | 计算绝对值 | ABS(-5) →5 |
POWER | 计算幂 | POWER(2, 3) →8 |
SQRT | 计算平方根 | SQRT(16) →4 |
🛠 使用示例
SELECT
ROUND(price, 2) AS rounded_price,
CEIL(quantity / 10) AS ceil_quantity,
FLOOR(discount * 100) AS floor_discount,
ABS(profit) AS absolute_profit,
POWER(rate, 2) AS rate_squared,
SQRT(stock) AS stock_sqrt
FROM sales;
🧐 代码解析
四舍五入价格:
ROUND(price, 2) AS rounded_price
将
price
字段的值四舍五入到小数点后两位,命名为rounded_price
。向上取整数量:
CEIL(quantity / 10) AS ceil_quantity
将
quantity
字段除以10后的结果向上取整,命名为ceil_quantity
。向下取整折扣:
FLOOR(discount * 100) AS floor_discount
将
discount
字段乘以100后的结果向下取整,命名为floor_discount
。计算利润的绝对值:
ABS(profit) AS absolute_profit
计算
profit
字段的绝对值,命名为absolute_profit
。计算利率的平方:
POWER(rate, 2) AS rate_squared
计算
rate
字段的平方,命名为rate_squared
。计算库存的平方根:
SQRT(stock) AS stock_sqrt
计算
stock
字段的平方根,命名为stock_sqrt
。
📝 聚合函数详解
聚合函数用于对一组数据进行汇总计算,常用于统计分析和报表生成。
🔍 常用聚合函数
函数名称 | 描述 | 示例 |
---|---|---|
COUNT | 计算行数或非NULL值的数量 | COUNT(*) ,COUNT(column) |
SUM | 计算数值的总和 | SUM(sales_amount) →5000 |
AVG | 计算数值的平均值 | AVG(score) →85.5 |
MAX | 获取数值中的最大值 | MAX(price) →999.99 |
MIN | 获取数值中的最小值 | MIN(price) →0.99 |
GROUP_CONCAT | 将分组后的数据连接成一个字符串 | GROUP_CONCAT(name) →Alice,Bob,Charlie |
🛠 使用示例
SELECT
category,
COUNT(*) AS total_items,
SUM(price) AS total_sales,
AVG(price) AS average_price,
MAX(price) AS highest_price,
MIN(price) AS lowest_price
FROM products
GROUP BY category;
🧐 代码解析
分组类别:
category
按照
category
字段进行分组。计算总项数:
COUNT(*) AS total_items
计算每个类别中的总项数,命名为
total_items
。计算总销售额:
SUM(price) AS total_sales
计算每个类别的
price
字段总和,命名为total_sales
。计算平均价格:
AVG(price) AS average_price
计算每个类别的
price
字段平均值,命名为average_price
。获取最高价格:
MAX(price) AS highest_price
获取每个类别的
price
字段最大值,命名为highest_price
。获取最低价格:
MIN(price) AS lowest_price
获取每个类别的
price
字段最小值,命名为lowest_price
。
📝 条件函数详解
条件函数用于基于特定条件进行数据处理和转换,常用于数据清洗和格式转换。
🔍 常用条件函数
函数名称 | 描述 | 示例 |
---|---|---|
IF | 根据条件返回不同的值 | IF(age > 18, 'Adult', 'Minor') →Adult |
CASE | 多条件判断,返回对应的结果 | CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END |
COALESCE | 返回第一个非NULL值 | COALESCE(address, 'Unknown') →Unknown |
NULLIF | 如果两个表达式相等,则返回NULL,否则返回第一个表达式的值 | NULLIF(column1, column2) |
🛠 使用示例
SELECT
name,
age,
IF(age >= 18, 'Adult', 'Minor') AS age_group,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END AS grade,
COALESCE(email, 'No Email') AS contact_email
FROM students;
🧐 代码解析
条件判断年龄组:
IF(age >= 18, 'Adult', 'Minor') AS age_group
判断
age
是否大于等于18,若是则返回Adult
,否则返回Minor
,并命名为age_group
。多条件判断成绩等级:
CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END AS grade
根据
score
字段的值,返回对应的成绩等级A
、B
或C
,并命名为grade
。处理空值邮箱:
COALESCE(email, 'No Email') AS contact_email
如果
email
字段为NULL,则返回No Email
,否则返回email
的实际值,命名为contact_email
。
📝 其他常用函数详解
除了上述主要类别,Hive还提供了许多其他实用函数,用于类型转换、正则表达式处理等。
🔍 常用其他函数
函数名称 | 描述 | 示例 |
---|---|---|
CAST | 数据类型转换 | CAST(price AS DOUBLE) →99.99 |
NVL | 返回第一个非NULL值 | NVL(address, 'Unknown') →Unknown |
REGEXP | 正则表达式匹配 | REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') |
🛠 使用示例
SELECT
name,
CAST(age AS STRING) AS age_str,
NVL(phone, 'No Phone') AS contact_phone,
CASE
WHEN REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') THEN 'Valid'
ELSE 'Invalid'
END AS email_status
FROM employees;
🧐 代码解析
转换数据类型:
CAST(age AS STRING) AS age_str
将
age
字段转换为字符串类型,命名为age_str
。处理空值电话号码:
NVL(phone, 'No Phone') AS contact_phone
如果
phone
字段为NULL,则返回No Phone
,否则返回phone
的实际值,命名为contact_phone
。验证邮箱格式:
CASE WHEN REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') THEN 'Valid' ELSE 'Invalid' END AS email_status
使用正则表达式验证
email
字段的格式,若匹配则返回Valid
,否则返回Invalid
,并命名为email_status
。
🧩 函数综合应用示例
为了更好地理解这些函数的实际应用,以下是一个综合示例,展示如何在一个查询中结合使用多种函数。
📝 综合示例代码
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
IF(age >= 18, 'Adult', 'Minor') AS age_group,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END AS grade,
COALESCE(email, 'No Email') AS contact_email,
ROUND(AVG(salary), 2) AS average_salary,
DATE_FORMAT(join_date, 'yyyy-MM-dd') AS formatted_join_date
FROM employees
WHERE REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
GROUP BY
CONCAT(first_name, ' ', last_name),
IF(age >= 18, 'Adult', 'Minor'),
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END,
COALESCE(email, 'No Email'),
DATE_FORMAT(join_date, 'yyyy-MM-dd');
🧐 代码解析
拼接全名:
CONCAT(first_name, ' ', last_name) AS full_name
将
first_name
和last_name
拼接成full_name
。判断年龄组:
IF(age >= 18, 'Adult', 'Minor') AS age_group
根据
age
判断是否为成年人,结果命名为age_group
。计算成绩等级:
CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END AS grade
根据
score
计算成绩等级,命名为grade
。处理空值邮箱:
COALESCE(email, 'No Email') AS contact_email
处理
email
为空的情况,命名为contact_email
。计算平均薪资:
ROUND(AVG(salary), 2) AS average_salary
计算
salary
的平均值并四舍五入到两位小数,命名为average_salary
。格式化入职日期:
DATE_FORMAT(join_date, 'yyyy-MM-dd') AS formatted_join_date
将
join_date
格式化为yyyy-MM-dd
格式,命名为formatted_join_date
。过滤有效邮箱:
WHERE REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
仅选择符合正则表达式的有效邮箱记录。
分组依据:
GROUP BY CONCAT(first_name, ' ', last_name), IF(age >= 18, 'Adult', 'Minor'), CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END, COALESCE(email, 'No Email'), DATE_FORMAT(join_date, 'yyyy-MM-dd')
按照全名、年龄组、成绩等级、邮箱、入职日期进行分组,以便计算每组的平均薪资。
🌟 总结
Hive提供了丰富多样的函数,涵盖字符串处理、日期操作、数学计算、数据聚合等多个方面。通过合理运用这些函数,开发者能够高效地进行数据查询、清洗和分析,提升数据处理的准确性和效率。🔧
- 字符串函数:用于文本数据的拼接、截取、替换等操作。
- 日期函数:用于处理和格式化日期及时间数据。
- 数学函数:用于执行各种数学计算和操作。
- 聚合函数:用于对数据进行汇总和统计分析。
- 条件函数:用于基于条件进行数据处理和转换。
- 其他函数:如类型转换和正则表达式处理,辅助数据处理任务。
通过本文的详解和示例,您可以更好地理解并应用Hive中的常用函数,提升数据处理和分析的能力。🚀