将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类型作为分区列。