更新时间:2025-10-30 GMT+08:00
分享

Hive Load/Truncate+Load/Load Overwrite写入模式最佳实践

概述

在数据集成服务中,Hive的数据加载操作是常见的数据迁移和更新方式。根据不同的业务需求,可以选择不同的加载模式:LoadTruncate+LoadLoad Overwrite。每种模式都有其适用场景和特点。

Hive 数据写入模式

  • Load 模式

    Load 模式是最基本的加载方式,直接将数据文件加载到目标Hive表中。数据集成采用原生的Hive文件写入能力,适配分区表、非分区的Hive文件格式。

    • 特点
      • 不清理目标表:加载数据前不会对目标表进行任何清理操作。
      • 适用场景:适用于数据追加场景,即目标表中已存在数据,新数据需要追加到目标表中。
    • 实践样例

      假设源端为MYSQL数据表data,目标表为Hive数据表data,分区字段为dt,配置作业后将数据增量写入Hive表中。

      图1 配置源端目的端数据表

      源端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 配置源端目的端数据表

      源端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 配置参数
      • 动态分区

        Mysql的源端数据包含多个分区的数据,希望源数据中的分区字段值将被自动识别并用于确定目标分区,允许一次性覆盖多个分区,满足多分区数据更新的需求。

        用户可以选择【写入模式】为【Load_Overwrite】,【分区过滤条件】为不填入,同时字段映射配置源和目的端分区字段dt。

        图4 配置参数

总结

通过合理选择Load/Truncate+Load/Load Overwrite三种Hive数据加载模式,可以根据不同的业务需求高效地进行数据迁移和更新。在实际操作中,建议遵循上述最佳实践建议,确保数据的一致性和系统的性能。

相关文档