将Hudi表数据同步到Hive
操作场景
Hudi表中的数据能够在Hive中进行高效的查询和分析。通过执行run_hive_sync_tool.sh脚本,可以将Hudi表的数据同步到Hive中,从而充分利用Hive的查询能力和生态工具,提高数据处理的效率和查询性能。
Hudi表数据同步到Hive
例如:需要将HDFS上目录为hdfs://hacluster/tmp/huditest/hudimor1_deltastreamer_partition的Hudi表同步为Hive表,表名为table hive_sync_test3,使用unite、country和state为分区键,命令示例如下:
run_hive_sync_tool.sh --partitioned-by unite,country,state --base-path hdfs://hacluster/tmp/huditest/hudimor1_deltastreamer_partition --table hive_sync_test3 --partition-value-extractor org.apache.hudi.hive.MultiPartKeysValueExtractor --support-timestamp
命令 | 描述 | 必填 | 默认值 |
|---|---|---|---|
--database | Hive database名称 | N | default |
--table | Hive表名 | Y | - |
--base-file-format | 文件格式 (PARQUET或HFILE) | N | PARQUET |
--user | Hive用户名 | N | - |
--pass | Hive密码 | N | - |
--jdbc-url | Hive jdbc connect url | N | - |
--base-path | 待同步的Hudi表存储路径 | Y | - |
--partitioned-by | 分区键 | N | - |
--partition-value-extractor | 分区类,需实现PartitionValueExtractor ,可以从HDFS路径中提取分区值 | N | SlashEncodedDayPartitionValueExtractor |
--assume-date-partitioning | 以yyyy/mm/dd进行分区从而支持向后兼容。 | N | false |
--use-pre-apache-input-format | 使用com.uber.hoodie包下的InputFormat替换org.apache.hudi包下的。除了从com.uber.hoodie迁移项目至org.apache.hudi外请勿使用。 | N | false |
--use-jdbc | 使用Hive jdbc连接 | N | true |
--auto-create-database | 自动创建Hive database | N | true |
--skip-ro-suffix | 注册时跳过读取_ro后缀的读优化视图 | N | false |
--use-file-listing-from-metadata | 从Hudi的元数据中获取文件列表 | N | false |
--verify-metadata-file-listing | 根据文件系统验证Hudi元数据中的文件列表 | N | false |
--help、-h | 查看帮助 | N | false |
--support-timestamp | 将原始类型中'INT64'的TIMESTAMP_MICROS转换为Hive的timestamp | N | false |
--decode-partition | 如果分区在写入过程中已编码,则解码分区值 | N | false |
--batch-sync-num | 指定每批次同步hive的分区数 | N | 1000 |

Hive Sync时会判断表不存在时建外表并添加分区,表存在时对比表的schema是否存在差异,存在则替换,对比分区是否有新增,有则添加分区。
因此使用hive sync时有以下约束:
- 写入数据Schema只允许增加字段,不允许修改、删除字段。
- 分区目录只能新增,不会删除。
- Overwrite覆盖写Hudi表不支持同步覆盖Hive表。
- Hudi同步Hive表时,不支持使用timestamp类型作为分区列。

