
# 导入导出Hive表/分区数据
#### 操作场景
在大数据应用场景中，往往存在将Hive中的数据表迁移到另一个集群上，使用Hive的导入导出命令可以实现表级别数据迁移，即可使用Export命令将源集群的Hive表导出到目标集群的HDFS中，再在目标集群使用Import命令将导出的数据导入到相应的Hive表中。
#### 约束与限制
- 本章节内容适用于MRS 3.2.0及之后版本。
- Hive表导入导出功能目前不支持对加密表、HBase外部表、Hudi表、视图表、物化视图表进行导入导出操作。
- 导出表/分区数据时，存放表/分区数据的HDFS路径需提前创建，且该目录为空，否则导出失败。
- 导出分区时，导出的表必须为分区表，且不支持导出同一个分区字段的多个分区值的数据；导入到表中分区时导入的表必须是分区表。
 
#### 前提条件
- 如果是跨集群对Hive表或分区数据进行导入导出，且目标集群和源集群都开启了Kerberos认证，需配置跨集群互信。
- 如果使用Import/Export命令导入导出其他用户创建的表或分区，需要授予用户对应表的权限：
  - 集群未启用Ranger鉴权，需登录FusionInsight Manager授予该用户所属角色对应表的"Select授权"权限，详细操作请参考[配置Hive表、列或数据库的用户权限](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0950.html)章节。
  
  - 集群启用了Ranger鉴权，需参考[添加Hive的Ranger访问权限策略](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1858.html)章节授予用户对应表的Import/Export操作权限。
   
- 还需在源端集群和目标集群启用集群间复制功能。
- 需配置源端集群访问目标集群HDFS服务地址参数。 登录源端集群的FusionInsight Manager，选择"集群 \> 服务 \> Hive \> 配置"，搜索"hdfs.site.customized.configs"，新增自定义参数"dfs.namenode.rpc-address.haclusterX"，值为"*目标集群主NameNode实例节点业务IP* :*RPC端口* "；新增自定义参数"dfs.namenode.rpc-address.haclusterX1"，值为"*目标集群备NameNode实例节点的业务IP* :*RPC端口*"，NameNode RPC端口默认为"25000"。保存配置后需滚动重启Hive服务。
  
 
#### 操作步骤
1. 以Hive客户端安装用户登录源端集群安装客户端的节点。
2. 执行以下命令，切换到客户端安装目录，例如安装目录为"/opt/client"，请用户根据实际情况修改。 
   ```
   cd /opt/client
   ```
   
   
3. 执行以下命令配置环境变量。 
   ```
   source bigdata_env
   ```
   
   
4. 如果集群开启了Kerberos认证，执行以下命令认证用户，否则跳过此步骤。
   
   ```
   kinit Hive业务用户
   ```
   
   
5. 执行以下命令登录源端集群的Hive客户端。 
   ```
   beeline
   ```
   
   
6. 执行以下命令创建表"export_test"。 
   ```
   create table export_test(id int);
   ```
   
   
7. 执行以下命令向表"export_test"中插入数据。 
   ```
   insert into export_test values(123);
   ```
   
   
8. 在目标集群重复执行[1]-[4]，并执行以下命令创建存放表"export_test"导出后的HDFS路径。
   
   ```
   hdfs dfs -mkdir /tmp/export
   ```
   
   
9. 执行以下命令登录目标集群的Hive客户端。 
   ```
   beeline
   ```
   
   
10. 导入导出表"export_test"。 
    使用Hive Import/Export对表数据迁移时，支持以下几种场景，可以根据实际情况选择合适的导入导出方式。
    - 场景一：简单导出导入
      1. 在源端集群执行以下命令将表"export_test"的元数据和业务数据导出到[8]创建的目录下。
         ```
         export table export_test to 'hdfs://haclusterX/tmp/export';
         ```
         
      
      2. 在目标集群执行以下命令将[10.a]导出的表数据导入到表"export_test"中。
         ```
         import from '/tmp/export';
         ```
         
       
    
    
    
    - 场景二 ：在导入时重命名表
      1. 在源端集群执行以下命令将表"export_test"的元数据和业务数据导出到[8]创建的目录下。
         ```
         export table export_test to 'hdfs://haclusterX/tmp/export';
         ```
         
      
      2. 在目标集群执行以下命令将[10.a]导出的表数据导入到表"import_test"中。
         ```
         import table import_test from '/tmp/export';
         ```
         
       
    
    
    
    - 场景三：导出分区数据并导入
      1. 在源端集群执行以下命令将表"export_test"的pt1和pt2分区导出到[8]创建的目录下。
         ```
         export table export_test partition (pt1="in", pt2="ka") to 'hdfs://haclusterX/tmp/export';
         ```
         
      
      2. 在目标集群执行以下命令将[10.a]导出的表数据导入到表"export_test"中。
         ```
         import from '/tmp/export';
         ```
         
       
    
    - 场景四：导出表数据并且将该数据导入到分区中
      1. 在源端集群执行以下命令将表"export_test"的元数据和业务数据导出到[8]创建的目录下。
         ```
         export table export_test to 'hdfs://haclusterX/tmp/export';
         ```
         
      
      2. 在目标集群执行以下命令将**[10.a]** 导出的表数据导入到表"import_test"的pt1和pt2分区中。
         ```
         import table import_test partition (pt1="us", pt2="tn") from '/tmp/export';
         ```
         
       
    
    - 场景五：导入表数据时指定表的Location
      1. 在源端集群执行以下命令将表"export_test"的元数据和业务数据导出到[8]创建的目录下。
         ```
         export table export_test to 'hdfs://haclusterX/tmp/export';
         ```
         
      
      2. 在目标集群执行以下命令将[10.a]导出的表数据导入到表"import_test"中，且该表的Location为"/*tmp/export* "。
         ```
         import table import_test from '/tmp' location '/tmp/export';
         ```
         
       
    
    - 场景六：导入表数据为外部表
      1. 在源端集群执行以下命令将表"export_test"的元数据和业务数据导出到[8]创建的目录下。
         ```
         export table export_test to 'hdfs://haclusterX/tmp/export';
         ```
         
      
      2. 在目标集群执行以下命令将**[10.a]** 导出的表数据导入到外部表"import_test"中。
         ```
         import external table import_test from '/tmp/export';
         ```
         
       
    
    - "**hacluster**X"为新增的自定义参数"dfs.namenode.rpc-address.haclusterX"中的"haclusterX"。
    
    - 导入数据时需注意：
      - 使用**import from '** */tmp/export* **';** 命令导入表是没有指定表名的场景，该场景导入的数据会保存到与源表名相同的表路径下，需注意以下两点：
        - 如果目标集群上不存在与源集群上同名的表，在导入表的过程中会创建该表。
        
        - 如果目标集群上已存在与源集群上同名的表，该表对应的HDFS目录下必须为空，否则导入失败。
         
      
      - 使用**import external table** *import_test* **from '** */tmp/export* **';** 命令导入表会将导出的表导入到指定的表中，需注意以下两点：
        - 如果目标集群上不存在与指定的表名相同的表，在导入表的过程中会创建该表。
        
        - 如果目标集群上已存在与指定的表名相同的表，该表对应的HDFS目录下必须为空，否则导入失败。
         
       
    
    
    
    
 
