将Hudi表数据同步到Hive
通过执行run_hive_sync_tool.sh可以将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类型作为分区列。