# 快速使用Hive进行数据分析
在企业数据仓库场景中，业务系统积累了大量的用户信息数据（如用户编号、姓名、性别、年龄、地址等），管理员或开发人员需要使用SQL语句对这些结构化数据进行统计分析。但传统的MapReduce开发需要编写Java代码，开发周期长且门槛较高。如何在不需要开发专门MapReduce应用的前提下，通过类SQL语句快速实现数据统计分析？Hive作为基于Hadoop的数据仓库工具，提供了类SQL的HQL查询能力，可将结构化的数据文件映射为数据库表，使熟悉SQL的用户能快速进行数据仓库统计分析。本文以用户信息表管理为例，介绍如何使用Hive快速进行数据分析。
基本概念：
- **内部表**：Hive管理的表，表的数据存储位置由Hive控制（默认在HDFS的"/user/hive/warehouse/"目录下）。删除内部表时，表数据和元数据都会被删除。
- **外部分区表（External Partitioned Table）**：Hive不管理数据本身的表，表数据存储在用户指定的HDFS路径下，删除表时仅删除元数据而保留数据。分区表按分区键将数据分散到不同目录，提升查询效率。
- **beeline**：Hive的交互式命令行客户端工具，通过JDBC连接HiveServer2服务执行HQL语句。在MRS集群中，通过beeline可执行建表、查询、删除等操作。
#### 背景信息
假定用户开发一个应用程序，用于管理企业中的使用A业务的用户信息，使用Hive客户端实现A业务操作流程如下：
**普通表的操作：**
- 创建用户信息表**user_info**。
- 在用户信息中新增用户的学历、职称信息。
- 根据用户编号查询用户姓名和地址。
- A业务结束后，删除用户信息表。
 表1用户信息 
| **编号**      | **姓名** | **性别** | **年龄** | **地址** |
|:---|:---|:---|:---|:---|
| 12005000201 | A     | 男      | 19     | A城市    |
| 12005000202 | B     | 女      | 23     | B城市    |
| 12005000203 | C     | 男      | 26       | C城市    |
| 12005000204 | D     | 男      | 18     | D城市    |
| 12005000205 | E     | 女      | 21      | E城市    |
| 12005000206 | F     | 男      | 32     | F城市    |
| 12005000207 | G     | 女       | 29     | G城市     |
| 12005000208 | H     | 女      | 30     | H城市    |
| 12005000209 | I     | 男      | 26     | I城市    |
| 12005000210                  | J                       | 女                       | 25                        | J城市                      |
   
#### 前提条件
- 已安装Hive客户端。了解如何安装客户端，请参考[安装客户端（3.x及之后版本）](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
- 当前用户已具有创建Hive表的权限。如果集群启用了Kerberos认证，需配置具有对应权限的角色。
 
#### 操作步骤
1. 以客户端安装用户，登录安装客户端的节点，客户端安装详细操作请参见[安装客户端（3.x及之后版本）](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
2. 执行以下命令切换到客户端目录，客户端安装目录如：/opt/client。 
   ```
   cd /opt/client
   ```
   
   
3. 执行以下命令配置环境变量。 
   ```
   source bigdata_env
   ```
   
   
4. 如果当前集群已启用Kerberos认证，执行以下命令认证当前用户，当前用户需要具有创建Hive表的权限，具体请参见[创建角色](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0343.html)配置拥有对应权限的角色，参考[创建用户](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0345.html)为用户绑定对应角色。如果当前集群未启用Kerberos认证，则无需执行此命令。
   
   ```
   kinit MRS集群用户
   ```
   例如：
   ```
   kinit hiveuser
   ```
   
   
5. 运行Hive客户端命令，实现A业务。 
   - **内部表操作**
     1. 执行以下命令登录Hive客户端命令行：
        ```
        beeline
        ```
        
     
     2. 根据[表1]创建用户信息表**user_info** 并添加相关数据，例如：
        创建表**user_info**：
        ```
        create table user_info(id string,name string,gender string,age int,addr string);
        ```
        向表**user_info**中插入数据：
        ```
        insert into table user_info(id,name,gender,age,addr) values("12005000201","A","男",19,"A城市");
        ```
        
     
     3. 在用户信息表**user_info** 中新增用户的学历、职称信息。
        以增加编号为12005000201的用户的学历、职称信息为例，其他用户类似。
        ```
        alter table user_info add columns(education string,technical string);
        ```
        
     
     4. 根据用户编号查询用户姓名和地址。 以查询编号为12005000201的用户姓名和地址为例，其他用户类似。
        ```
        select name,addr from user_info where id='12005000201';
        ```
        
     
     5. 删除用户信息表。
        ```
        drop table user_info;
        ```
        
     
     6. 执行以下命令退出Hive客户端。
        ```
        !q
        ```
        
      
   
   
   
   - **外部分区表操作**
     1. 可使用insert语句直接向外部表中插入数据，也可以使用**l** **oad data** 命令导入HDFS中的文件数据到外部表中。如果需要使用l**oad data** 命令导入文件数据，需执行以下操作：
        1. 根据[表1]数据创建文件。例如，文件名为"txt.log"，以空格拆分字段，以换行符作为行分隔符。
        
        2. 执行以下命令上传文件至HDFS中，例如"/tmp"目录下。
           ```
           hdfs dfs -put txt.log /tmp
           ```
           
         
     
     2. 执行以下命令创建外部表数据存储路径： 创建"/hive"目录：
        ```
        hdfs dfs -mkdir /hive/
        ```
        创建"/hive/user_info"目录：
        ```
        hdfs dfs -mkdir /hive/user_info
        ```
        
     
     3. 执行以下命令登录Hive客户端命令行：
        ```
        beeline
        ```
        
     
     4. 执行以下命令创建表：
        ```
        create external table user_info(id string,name string,gender string,age int,addr string) partitioned by(year string) row format delimited fields terminated by ' ' lines terminated by '\n' stored as textfile location '/hive/user_info';
        ```
        其中：
        - fields terminated：表示分隔的字符，如按空格分隔，则值为' '。
        
        - lines terminated：表示分行的字符，如按换行分隔，则值为'\\n'。
        
        - */hive/user_info* ：存储表**user_info**数据的HDFS路径。
         
     
     5. 导入数据。
        - 使用insert语句插入数据，以插入编号为12005000201的用户相关信息为例，其他用户类似。
          ```
          insert into user_info partition(year="2018") values ("12005000201","A","男",19,"A城市");
          ```
          
        
        - 使用**load data** 命令导入文件数据。
          ```
          load data inpath '/tmp/txt.log' into table user_info partition (year='2011');
          ```
          其中，"/tmp/txt.log"为[5.a]上传至HDFS的数据文件。
          
         
     
     6. 执行以下命令查询导入数据。
        ```
        select * from user_info;
        ```
        
     
     7. 执行以下命令删除用户信息表。
        ```
        drop table user_info;
        ```
        
     
     8. 执行以下命令退出Hive客户端。
        ```
        !q
        ```
        
      
   
   
   
   
**验证操作：**
在beeline客户端执行命令查看表是否创建成功。
执行查询语句验证数据是否正确导入。
```
show tables;
```
退出beeline后，可通过HDFS客户端查看内部表数据是否被删除、外部分区表数据是否保留。
#### 常见问题
- **beeline连接Hive失败**
  连接失败的常见原因包括：未执行kinit认证（Kerberos集群）、HiveServer服务异常、用户没有Hive访问权限、beeline客户端配置错误。
  如启用了Kerberos认证，请先执行kinit命令完成认证。在Manager的服务列表页面查看Hive服务状态是否良好。确认当前用户已被授予Hive访问权限。
  如仍无法连接，请联系管理员检查Hive服务的beeline连接配置。
  
- **执行建表语句报错无权限**
  当前用户没有创建表的权限，或Ranger中未配置对应的Hive访问策略。
  如启用了Ranger鉴权，请在Ranger中为该用户配置Hive的建表权限策略。
  
- **删除内部表后数据也被删除，如何保留数据**
  内部表的数据由Hive完全管理，删除内部表时表数据和元数据会被同时清除，这是Hive内部表的默认行为。
  如需在删除表时保留数据，请使用外部分区表（external table）。创建外部表时通过LOCATION参数指定数据存储路径，删除表时仅清除元数据，HDFS上的原始数据将保留。
  
 
#### 相关文档
- 了解如何安装MRS集群客户端，请参考[安装客户端（3.x及之后版本）](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
- 了解Hive SQL相关语法说明，请参考[Hive常见SQL语法说明](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300258.html)。
- 了解Hive常见日志，请参考[Hive日志介绍](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0976.html)。
 
