0%

hive函数全解析:从内置函数到自定义函数的实战指南

Hive 提供了丰富的函数库,包括内置函数(UDF、UDAF、UDTF)和自定义函数,满足数据清洗、转换、聚合等复杂分析需求。本文详细讲解 Hive 函数的分类、常用内置函数(尤其是窗口函数)的用法,以及自定义函数的开发流程,帮助开发者高效处理数据。

Hive 函数基础与分类

Hive 函数按输入输出关系可分为三类,覆盖不同的数据处理场景:

函数分类

类型 全称 作用 示例
UDF User-Defined Function 一进一出(单条记录输入,单条结果输出) concat()nvl()
UDAF User-Defined Aggregate Function 多进一出(多条记录输入,单条聚合结果输出) sum()avg()collect_set()
UDTF User-Defined Table-Generating Function 一进多出(单条记录输入,多条结果输出) explode()split()

函数查询与帮助

  • 查看所有内置函数

    1
    hive> show functions;  -- 列出所有可用函数  
  • 查看函数用法

    1
    2
    3
    4
    -- 基础说明  
    hive> desc function concat;
    -- 详细说明(含示例)
    hive> desc function extended concat;
  • 模糊查询函数

    1
    hive> desc function like '*date*';  -- 查找含“date”的函数  

常用内置函数详解

数据清洗与转换函数

空值处理:nvl

NULL 值赋默认值,避免计算异常。

阅读全文 »

hive分区信息丢失问题全解析:从原因到修复方案

在 Hive 分区表使用中,“通过 HDFS 直接上传数据到分区目录后,Hive 无法查询到该分区” 是常见问题。这一问题的核心在于 元数据与实际数据不同步,Hive 元数据服务(Metastore)未记录手动创建的分区信息。本文详细讲解问题原因、修复方法及预防措施,确保分区表数据可正常查询。

问题现象与核心原因

现象描述

  1. 在 HDFS 上手动创建分区目录(如 date=20210415)并上传数据文件;
  2. 在 Hive 中执行 SHOW PARTITIONS test_partitioned; 未显示该分区;
  3. 执行 SELECT * FROM test_partitioned WHERE date='20210415'; 无结果,提示 “分区不存在”。

核心原因:元数据与实际数据不同步

Hive 分区表的分区信息需同时满足两个条件才能被查询:

  1. 实际数据存在:HDFS 上有对应的分区目录(如 date=20210415)及数据文件;
  2. 元数据记录:Hive Metastore(元数据存储,如 MySQL)中存在该分区的元数据条目。

当通过 HDFS 命令手动创建分区目录时,仅满足条件 1,但未通知 Metastore 记录元数据,导致 Hive 无法识别该分区。

修复分区信息的核心方法:MSCK REPAIR TABLE

Hive 提供 MSCK REPAIR TABLE 命令(MSCKMetaStore Check),用于扫描表的 HDFS 目录,自动发现未被元数据记录的分区,并将其添加到 Metastore 中。

操作步骤

  1. 确认 HDFS 分区目录存在
    先通过 HDFS 命令验证分区目录和数据文件已正确上传:

阅读全文 »

Hive 分区表详解:从基础分区到二级分区的优化实践

分区表是 Hive 提升大数据查询效率的核心特性,通过将数据按指定维度(如日期、地域)拆分到不同目录,避免全表扫描,显著减少查询耗时。本文详细讲解 Hive 分区表的创建、数据插入、查询优化及二级分区的应用,帮助开发者合理设计分区策略。

分区表的核心作用与原理

Hive 作为数据仓库,存储的表往往包含海量数据(如每日千万级日志)。若直接查询全表,需扫描所有数据,效率极低。分区表通过 “文件夹拆分数据”,将大表按分区列(如 dateregion)拆分为多个子目录,查询时只需扫描目标分区目录,大幅提升效率。

底层存储原理

分区表在 HDFS 上的存储路径格式为:

1
/user/hive/warehouse/<数据库名>.db/<表名>/<分区列1>=<值1>/<分区列2>=<值2>/...  

例如,按 date='2023-10-01' 分区的表,数据存储路径为:

1
/user/hive/warehouse/study_hive.db/test_partitioned/date=2023-10-01/  

基础分区表操作

创建分区表

通过 PARTITIONED BY 关键字定义分区列(分区列不算表的普通列,仅用于分区目录拆分)。

语法格式
阅读全文 »

hive查询数据详解:从基础语法到分布式特性

Hive 查询语法与传统 SQL 高度兼容,但作为分布式数据仓库,其查询执行依赖 MapReduce/Spark 等引擎,因此衍生出适合分布式场景的特性(如 SORT BYDISTRIBUTE BY 等)。本文重点讲解 Hive 查询的基础语法、分布式排序与分区特性,帮助开发者高效编写 Hive SQL。

Hive 查询基础语法

Hive 查询核心语法与 SQL 一致,支持 SELECTWHEREGROUP BYJOIN 等常见操作,适用于结构化数据的筛选、聚合和关联分析。

基础查询操作

操作类型 语法示例 说明
全表扫描 SELECT * FROM dept; 查询表中所有列和行
特定列查询 SELECT deptno, dname FROM dept; 仅查询指定列,减少数据传输
条件过滤 SELECT * FROM emp WHERE sal > 2000; 通过 WHERE 筛选符合条件的行
别名设置 SELECT deptno AS no, dname AS name FROM dept; AS 为列或表设置别名,简化查询
去重查询 SELECT DISTINCT deptno FROM emp; DISTINCT 去除重复值

范围与模糊查询

Hive 支持 SQL 中的范围判断和模糊匹配,满足复杂筛选需求:

范围查询
1
2
3
4
5
-- 数值范围(BETWEEN ... AND)  
SELECT * FROM emp WHERE sal BETWEEN 1000 AND 3000;

-- 枚举范围(IN)
SELECT * FROM emp WHERE deptno IN (10, 20); -- 查询部门 10 和 20 的数据

模糊查询(LIKE

阅读全文 »

hive数据导出全指南:从 HDFS 到本地的完整方案

Hive 数据导出是数据分析流程的重要环节,需将处理后的结果导出到本地文件系统、HDFS 或其他系统。Hive 提供了多种导出方式,适用于不同场景(如批量导出、脚本自动化、元数据保留等)。本文详细讲解每种导出方式的操作步骤、原理及适用场景。

使用 INSERT OVERWRITE 语句导出数据

INSERT OVERWRITE 是 Hive 原生的导出命令,支持将查询结果导出到本地文件系统或 HDFS,可指定分隔符格式,灵活适配下游系统需求。

导出到本地文件系统

通过 LOCAL DIRECTORY 指定本地路径,将数据导出到客户端所在机器的本地目录。

语法格式
1
2
3
4
5
INSERT OVERWRITE LOCAL DIRECTORY '本地路径'  
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '分隔符' -- 指定列分隔符(如 '\t'、',')
[LINES TERMINATED BY '行分隔符'] -- 可选,指定行分隔符
SELECT1, 列2 FROM 表名 [WHERE 条件];
实操示例
1
2
3
4
5
-- 将 dept 表数据导出到本地 /tmp/hive_export 目录,列用制表符分隔  
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/hive_export/dept'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
SELECT deptno, dname FROM dept;
导出结果验证
阅读全文 »