Quantcast
Channel: 小蓝博客
Viewing all articles
Browse latest Browse all 3145

Hive中常用函数汇总

$
0
0

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;

🧐 代码解析

  1. 拼接姓名

    CONCAT(first_name, ' ', last_name) AS full_name

    first_namelast_name通过空格拼接成 full_name

  2. 截取邮箱前缀

    SUBSTR(email, 1, 5) AS email_prefix

    email字段的第1个字符开始,截取5个字符作为 email_prefix

  3. 计算电话号码长度

    LENGTH(phone_number) AS phone_length

    计算 phone_number字段的字符长度。

  4. 替换地址中的“Street”

    REPLACE(address, 'Street', 'St.') AS short_address

    address字段中的“Street”替换为“St.”,生成 short_address

📝 日期函数详解

日期函数用于处理日期和时间数据,常用于时间序列分析和报表生成。

🔍 常用日期函数

函数名称描述示例
CURRENT_DATE返回当前日期SELECT CURRENT_DATE2024-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;

🧐 代码解析

  1. 获取当前日期

    CURRENT_DATE AS today

    返回当前日期,并命名为 today

  2. 格式化订单日期

    DATE_FORMAT(order_date, 'yyyy/MM/dd') AS formatted_date

    order_date按照 yyyy/MM/dd格式进行格式化,命名为 formatted_date

  3. 计算交付天数

    DATEDIFF(delivery_date, order_date) AS delivery_days

    计算 delivery_dateorder_date之间的天数差,命名为 delivery_days

  4. 提取年份、月份和天数

    YEAR(order_date) AS order_year,
    MONTH(order_date) AS order_month,
    DAY(order_date) AS order_day

    分别提取 order_date中的年份、月份和天数,命名为 order_yearorder_monthorder_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;

🧐 代码解析

  1. 四舍五入价格

    ROUND(price, 2) AS rounded_price

    price字段的值四舍五入到小数点后两位,命名为 rounded_price

  2. 向上取整数量

    CEIL(quantity / 10) AS ceil_quantity

    quantity字段除以10后的结果向上取整,命名为 ceil_quantity

  3. 向下取整折扣

    FLOOR(discount * 100) AS floor_discount

    discount字段乘以100后的结果向下取整,命名为 floor_discount

  4. 计算利润的绝对值

    ABS(profit) AS absolute_profit

    计算 profit字段的绝对值,命名为 absolute_profit

  5. 计算利率的平方

    POWER(rate, 2) AS rate_squared

    计算 rate字段的平方,命名为 rate_squared

  6. 计算库存的平方根

    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;

🧐 代码解析

  1. 分组类别

    category

    按照 category字段进行分组。

  2. 计算总项数

    COUNT(*) AS total_items

    计算每个类别中的总项数,命名为 total_items

  3. 计算总销售额

    SUM(price) AS total_sales

    计算每个类别的 price字段总和,命名为 total_sales

  4. 计算平均价格

    AVG(price) AS average_price

    计算每个类别的 price字段平均值,命名为 average_price

  5. 获取最高价格

    MAX(price) AS highest_price

    获取每个类别的 price字段最大值,命名为 highest_price

  6. 获取最低价格

    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;

🧐 代码解析

  1. 条件判断年龄组

    IF(age >= 18, 'Adult', 'Minor') AS age_group

    判断 age是否大于等于18,若是则返回 Adult,否则返回 Minor,并命名为 age_group

  2. 多条件判断成绩等级

    CASE 
        WHEN score >= 90 THEN 'A'
        WHEN score >= 80 THEN 'B'
        ELSE 'C'
    END AS grade

    根据 score字段的值,返回对应的成绩等级 ABC,并命名为 grade

  3. 处理空值邮箱

    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;

🧐 代码解析

  1. 转换数据类型

    CAST(age AS STRING) AS age_str

    age字段转换为字符串类型,命名为 age_str

  2. 处理空值电话号码

    NVL(phone, 'No Phone') AS contact_phone

    如果 phone字段为NULL,则返回 No Phone,否则返回 phone的实际值,命名为 contact_phone

  3. 验证邮箱格式

    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');

🧐 代码解析

  1. 拼接全名

    CONCAT(first_name, ' ', last_name) AS full_name

    first_namelast_name拼接成 full_name

  2. 判断年龄组

    IF(age >= 18, 'Adult', 'Minor') AS age_group

    根据 age判断是否为成年人,结果命名为 age_group

  3. 计算成绩等级

    CASE 
        WHEN score >= 90 THEN 'A'
        WHEN score >= 80 THEN 'B'
        ELSE 'C'
    END AS grade

    根据 score计算成绩等级,命名为 grade

  4. 处理空值邮箱

    COALESCE(email, 'No Email') AS contact_email

    处理 email为空的情况,命名为 contact_email

  5. 计算平均薪资

    ROUND(AVG(salary), 2) AS average_salary

    计算 salary的平均值并四舍五入到两位小数,命名为 average_salary

  6. 格式化入职日期

    DATE_FORMAT(join_date, 'yyyy-MM-dd') AS formatted_join_date

    join_date格式化为 yyyy-MM-dd格式,命名为 formatted_join_date

  7. 过滤有效邮箱

    WHERE REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')

    仅选择符合正则表达式的有效邮箱记录。

  8. 分组依据

    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中的常用函数,提升数据处理和分析的能力。🚀


Viewing all articles
Browse latest Browse all 3145

Trending Articles