
# Hive Load/Truncate+Load/Load Overwrite写入模式最佳实践
#### 概述
在数据集成服务中，Hive的数据加载操作是常见的数据迁移和更新方式。根据不同的业务需求，可以选择不同的加载模式：**Load** 、**Truncate+Load** 和**Load Overwrite**。每种模式都有其适用场景和特点。
#### Hive数据写入模式
- **Load模式**
  **Load模式**是最基本的加载方式，直接将数据文件加载到目标Hive表中。数据集成采用原生的Hive文件写入能力，适配分区表、非分区的Hive文件格式。
  - 特点
    - **不清理目标表**：加载数据前不会对目标表进行任何清理操作。
    
    - **适用场景**：适用于数据追加场景，即目标表中已存在数据，新数据需要追加到目标表中。
     
  
  - 实践样例 假设源端为MYSQL数据表data，目标表为Hive数据表data，分区字段为dt，配置作业后将数据增量写入Hive表中。
    图1配置源端目的端数据表   
    ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002474802566.png "点击放大")
    源端MySQL表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ```
    目标端Hive表
    ```
    CREATE TABLE `data` (  `id` varchar(10))PARTITIONED BY (`dt` date);
    ```
    
   
- **Truncate+Load模式**
  Truncate+Load模式是先清空目标表中的数据文件，然后加载新的数据。根据用户的作业配置，Truncate模式只清理分区下的数据文件，不删除分区。
  - 特点
    - **清理分区数据**：只清理分区下的数据文件，不删除分区。
    
    - **支持多组分区**：可以同时清理多个分区，并加载数据到这些分区。
    
    - **适用场景**：适用于需要完全更新目标表分区数据的场景。
     
  
  - 实践样例 假设源端为MYSQL数据表data，目标表为Hive数据表data，分区字段为dt，用户希望先清除dt=2025-10-21分区数据，并将数据重新写入Hive表中。
    图2配置源端目的端数据表   
    ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002509887738.png "点击放大")
    源端MySQL表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ```
    目标端Hive表
    ```
    CREATE TABLE `data` (  `id` varchar(10))PARTITIONED BY (`dt` date);
    ```
    
   
- **Load Overwrite模式**
  Load Overwrite模式是先将数据写入一个临时目录，然后使用Hive的LOAD DATA OVERWRITE语法将临时目录加载到目标表中。
  - 特点
    - **临时目录**：生成一个临时目录，目录名为表名_UUID。
    
    - **覆盖目标表**：使用LOAD DATA OVERWRITE语法覆盖目标表中的数据。
    
    - **适用场景**：适用于需要完全覆盖目标表分区数据的场景，通过该方式可以保证覆盖分区数据的一致性。
    
    - **动态分区与静态分区写入支持** ：Load Overwrite模式支持动态分区和静态分区两种写入场景，以提供多分区覆盖写能力和单分区覆盖写能力的多样诉求。
      - 动态分区写入：在动态分区写入场景中，源数据中的分区字段值将被自动识别并用于确定目标分区，允许一次性覆盖多个分区，满足多分区数据更新的需求。
      
      - 静态分区写入：在静态分区写入场景中，需要在加载语句中明确指定目标分区，仅覆盖指定的单个分区，适用于对特定分区进行精确更新的场景。
       
     
  
  - 实践样例 假设源端为MYSQL数据表data，目标表为Hive数据表data，分区字段为dt，用户希望将Mysql数据重新写入Hive表中。
    源端MySQL表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ```
    目标端Hive表
    ```
    CREATE TABLE `data` (  `id` varchar(10))PARTITIONED BY (`dt` date);
    ```
    - **静态分区**
      用户希望将Mysql的源端数据，统一写入Hive表dt=2025-10-21的一个分区。
      可以选择【写入模式】为【Load_Overwrite】，【分区过滤条件】为【dt=2025-10-21】。
      图3配置参数   
      ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002507087675.png "点击放大") 
    
    - **动态分区**
      Mysql的源端数据包含多个分区的数据，希望源数据中的分区字段值将被自动识别并用于确定目标分区，允许一次性覆盖多个分区，满足多分区数据更新的需求。
      用户可以选择【写入模式】为【Load_Overwrite】，【分区过滤条件】为不填入，同时字段映射配置源和目的端分区字段dt。
      图4配置参数   
      ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002507087925.png "点击放大") 
     
   
 
#### 总结
通过合理选择**Load/Truncate+Load/Load Overwrite**三种Hive数据加载模式，可以根据不同的业务需求高效地进行数据迁移和更新。在实际操作中，建议遵循上述最佳实践建议，确保数据的一致性和系统的性能。
