Hive 数据库基本操作指南

Apache Hive 是构建在 Hadoop 之上的数据仓库软件,它将结构化的数据文件映射为一张数据库表,并提供了一种名为 HiveQL(HQL)的类 SQL 查询语言。Hive 主要用于大数据集的批处理查询,非常适合数据仓库应用程序,如日志分析、数据挖掘等。

一、 权限管理:角色与用户

Hive 的权限管理模型类似于传统数据库,基于用户(User)角色(Role)权限(Privilege)。注意:Hive 的权限控制需要结合 Hadoop 的用户认证体系。

1. 创建角色并授予权限

首先,需要启用 Hive 的授权功能。在 hive-site.xml 中配置:

<property>
  <name>hive.security.authorization.enabled</name>
  <value>true</value>
</property>
<property>
  <name>hive.server2.enable.doAs</name>
  <value>false</value> <!-- 根据你的安全模式调整 -->
</property>

然后,通过 Hive CLI 或 Beeline 进行操作。

  • 创建角色CREATE ROLE role_name;
CREATE ROLE data_reader;
CREATE ROLE data_writer;

授予权限GRANT privilege_type ON object_type object_name TO ROLE role_name;

  • privilege_type: SELECT, INSERT, UPDATE, DELETE, ALL 等。
  • object_type: TABLE, DATABASE, VIEW 等。
-- 授予 data_reader 角色对数据库 mydb 下所有表的 SELECT 权限
GRANT SELECT ON DATABASE mydb TO ROLE data_reader;

-- 授予 data_writer 角色对表 mydb.sales 的 INSERT 权限
GRANT INSERT ON TABLE mydb.sales TO ROLE data_writer;

2. 创建用户并授予角色

Hive 本身不创建用户。用户由操作系统或 LDAP 等外部系统管理。我们通常使用现有的系统用户(如 user1)。Hive 的任务是将角色授予这些用户

  • 将角色授予用户GRANT ROLE role_name TO USER user_name;
-- 将 data_reader 角色授予 Linux 用户 alice
GRANT ROLE data_reader TO USER alice;

-- 将 data_writer 角色授予 Linux 用户 bob
GRANT ROLE data_writer TO USER bob;
  • 现在,用户 alice 就可以查询 mydb 数据库下的所有表了。

3. 回收角色/用户权限

  • 回收用户的角色REVOKE ROLE role_name FROM USER user_name;
REVOKE ROLE data_writer FROM USER bob;

回收角色的权限REVOKE privilege_type ON object_type object_name FROM ROLE role_name;

-- 回收 data_reader 角色对 mydb 数据库的 SELECT 权限
REVOKE SELECT ON DATABASE mydb FROM ROLE data_reader;

删除角色DROP ROLE role_name;

DROP ROLE data_reader;

二、 基本数据操作(增删改查)

Hive 的传统模型是“写时模式”(读时校验),更擅长批量导入和查询。新版本的 Hive(LLAP)也支持了更好的 ACID 事务功能。

  • 创建表
CREATE TABLE employees (
  id INT,
  name STRING,
  salary FLOAT,
  department STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

插入数据(增 – Insert)
Hive 通常不从逐条插入,而是批量加载数据。

-- 从HDFS文件加载数据(推荐,高效)
LOAD DATA INPATH '/user/hive/data/employees.csv' INTO TABLE employees;

-- 使用INSERT...VALUES(适用于少量数据,需开启ACID)
INSERT INTO TABLE employees VALUES (101, 'Alice', 55000, 'Engineering');

查询数据(查 – Select)

-- 简单查询
SELECT * FROM employees;

-- 条件过滤和聚合
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 50000
GROUP BY department;

更新数据(改 – Update)
需要将表创建为支持事务的 ORC 表

CREATE TABLE employees_transactional (
  id INT,
  name STRING,
  salary FLOAT,
  department STRING
)
STORED AS ORC
TBLPROPERTIES ('transactional'='true');

-- 然后才能执行更新
UPDATE employees_transactional
SET salary = 60000
WHERE id = 101;

删除数据(删 – Delete)
同样需要事务表支持。

DELETE FROM employees_transactional WHERE id = 101;

三、 创建视图(View)

视图是一个虚拟表,其内容由查询定义。它简化了复杂查询,并提供了逻辑层面的数据安全。

-- 创建一个视图,只显示工程部门的员工
CREATE VIEW engineering_employees AS
SELECT id, name, salary
FROM employees
WHERE department = 'Engineering';

-- 之后可以像查询普通表一样查询视图
SELECT * FROM engineering_employees WHERE salary > 70000;

四、 创建存储桶(Bucketed Table)

存储桶是一种将表数据按某列的值进行哈希分区后存储的技术,能极大提升等值连接(JOIN)和采样(SAMPLING)的效率。

CREATE TABLE user_actions_bucketed (
  user_id INT,
  action STRING,
  timestamp BIGINT
)
CLUSTERED BY (user_id) INTO 4 BUCKETS -- 根据 user_id 哈希成 4 个桶
STORED AS ORC;

注意:向桶表插入数据时,需要设置 hive.enforce.bucketing = true

五、 模式(Schema)、实例(Instance)与数据库(Database)的区别

这是一个非常重要的概念区分。

  1. 数据库(Database) / 模式(Schema)
    • 在 Hive 中,DATABASESCHEMA 是可互换的同义词CREATE DATABASE db1CREATE SCHEMA db1 效果完全相同。
    • 它们的主要作用是命名空间,用于隔离表、视图、函数等对象,避免命名冲突。例如,你可以有 db1.employeesdb2.employees 两个同名的表。
    • 可以理解为一个逻辑上的数据容器
  2. 实例(Instance)
    • 这个概念在 Hive 中并不像在传统关系型数据库(如 Oracle、MySQL)中那么突出。
    • 通常指的是 一个独立部署、安装和运行的 Hive 服务。这个服务包括:
      • Hive Metastore:存储所有元数据(表结构、数据库信息等)的服务。
      • HiveServer2 (HS2):提供 JDBC/ODBC 接口,供客户端提交查询的服务。
    • 一个 Hive 实例 可以管理多个数据库(模式)
    • 举例:公司A部署了一套 Hive(包含一个 Metastore 和一个 HiveServer2),这就是一个 Hive 实例。这个实例下可以创建 log_db(日志数据库)、user_db(用户数据库)等多个模式。

简单总结

  • 实例(Instance) -> 一个完整的 Hive 服务(就像一栋大楼)。
  • 数据库/模式(Database/Schema) -> 这栋大楼里的一个个房间,用来分门别类地存放不同的家具(表)。
  • 表(Table) -> 房间里的家具,比如床、桌子,是实际存放数据的地方。
This entry was posted in 应用. Bookmark the permalink.