
# DLI Load/Truncate_Load/Insert Overwrite写入模式最佳实践
#### 概述
数据集成服务使用DLI（数据湖探索）作为Lakehouse目标端时，同样提供三种写入模式：**Load** 、**Truncate+Load** 与**Insert Overwrite**。每种模式都有其独特的适用场景和特点，可以根据不同的业务需求进行选择。
#### DLI数据写入模式
- **Load模式**
  **Load模式**是DLI最基本的写入方式，直接将数据写入目标DLI表中，不会对目标表进行清理操作，而是以追加的方式写入数据。
  - 特点
    - **不清理目标表**：写入数据前不会对目标表进行任何清理操作，新数据会追加到目标表中。
    
    - **支持增量写入**：适用于数据追加场景，即目标表中已存在数据，新数据需要追加到目标表中，能够高效地处理增量数据。
     
  
  - 实践样例 假设源端为MYSQL数据表data，目标表为DLI数据表data，分区字段为dt。
    配置作业，MySQL表中的增量数据写入DLI表中，DLI会根据分区字段dt将数据追加到对应的分区中。
    图1配置源端目的端数据表   
    ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002484265432.png "点击放大")
    源端MySQL表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ```
    目标端DLI表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) using hudi options (type = 'cow',primaryKey = 'id',preCombineField = 'id');
    ```
    
   
- **Truncate+Load模式**
  Truncate+Load模式先清空目标DLI表中的分区数据，然后加载新的数据。
  - 特点
    - **清理目标区数据**：写入数据前会清空目标表选择的分区数据。
    
    - **分区保留**：虽然清空了数据，但分区结构仍然保留，新的数据会根据分区字段重新写入到对应的分区中。
     
  
  - 实践样例 假设源端为MYSQL数据表data，目标表为DLI数据表data，分区字段为dt。
    配置作业，先Truncate删除DLI表中dt=2025-10-21分区数据，然后将MySQL表中的数据重新写入DLI表中，DLI会根据分区字段dt将数据重新组织到对应的分区中。
    图2配置源端目的端数据表   
    ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002541407707.png "点击放大")
    源端MySQL表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ```
    目标端DLI表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) using hudi options (type = 'cow',primaryKey = 'id',preCombineField = 'id')partitioned by (dt);
    ```
    
   
- **Insert Overwrite模式**
  Insert Overwrite模式会先将数据写入一个临时表，然后使用DLI的INSERT OVERWRITE语法将临时表中的数据覆盖到目标表中。
  - **实现**
    这种模式在DLI中通过以下步骤实现：
    1. **创建临时表**：首先创建一个临时表，用于暂存写入的数据。
    
    2. **写入临时表**：将数据写入临时表。
    
    3. **覆盖目标表**：使用INSERT OVERWRITE语法将临时表中的数据覆盖到目标表中。
     
  
  - 特点
    - **临时表**：生成一个临时表，用于暂存写入的数据。
    
    - **覆盖目标表**：使用DLI的INSERT OVERWRITE语法覆盖目标表中的数据，确保数据的一致性。
    
    - **动态分区与静态分区写入支持** ：Insert Overwrite模式支持动态分区和静态分区两种写入场景。
      - **动态分区写入**：在动态分区写入场景中，源数据中的分区字段值将被自动识别并用于确定目标分区，允许一次性覆盖多个分区，满足多分区数据更新的需求。
      
      - **静态分区写入**：在静态分区写入场景中，需要在写入操作中明确指定目标分区，仅覆盖指定的单个分区，适用于对特定分区进行精确更新的场景。
       
     
  
  - 实践样例 假设源端为MYSQL数据表data，目标表为DLI数据表data，分区字段为dt。
    源端MySQL表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ```
    目标端DLI表
    ```
    CREATE TABLE `data` (  `id` varchar(10) DEFAULT NULL,  `dt` date DEFAULT NULL) using hudi options (type = 'cow',primaryKey = 'id',preCombineField = 'id')partitioned by (dt);
    ```
    - **静态分区写入**
      如果希望将MySQL表中的所有数据写入DLI表的dt=2025-10-21的分区，可以选择INSERT OVERWRITE模式，并在写入操作中指定分区过滤条件为dt=2025-10-21。
      图3配置参数   
      ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002484266718.png "点击放大") 
    
    - **动态分区**
      如果MySQL表中的数据包含多个分区的数据，希望根据源数据中的分区字段值自动识别并覆盖目标分区，可以选择Insert Overwrite模式，此时，无需指定分区过滤条件，同时确保字段映射配置dt分区字段。
      图4配置参数   
      ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002484426726.png "点击放大")
      图5配置映射关系   
      ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002484426742.png "点击放大") 
     
   
 
#### 总结
通过合理选择Load、Truncate+Load和Insert Overwrite三种DLI数据写入模式，可以根据不同的业务需求高效地进行数据迁移和更新。在实际操作中，建议遵循上述最佳实践建议，确保数据的一致性和系统的性能。
