
# Hudi创建表参数简化指导
在Hudi中，MOR表和COW表的创建可以通过指定少量参数来简化配置。本章节将指导用户在创建MOR表和COW表时如何简化参数，通过这些简化配置，用户可以更方便地创建MOR表和COW表，同时确保读写性能和存储效率的优化。
#### 约束限制
本章节仅支持MRS 3.6.0-LTS.1及之后版本。
#### Spark场景
- MOR表
  ```
  create table hudi_mor(业务字段) using hudi options(
  type="mor",
  primaryKey="主键字段",
  hoodie.bucket.index.num.buckets="20"
  )
  ```
  MOR表只需要上述3个参数，它会自动补充以下参数去设置preCombineField属性为主键字段（联合主键会取第一个作为preCombineField）、设置索引为BUCKET、设置写入方式为LSM、设置Parquet文件的压缩格式为zstd以及开启Log文件的Log Index，这些能力会提升读写性能和存储优化。**注意MOR表已经默认BUCKET索引，必须手动设置hoodie.bucket.index.num.buckets来指定桶数**。上述建表语句实现的效果等价于：
  ```
  create table hudi_mor(业务字段) using hudi options(
  type="mor",
  primaryKey="主键字段",
  preCombineField="主键字段",
  hoodie.index.type="BUCKET",
  hoodie.bucket.index.num.buckets="20",
  hoodie.lsm.style="true",
  hoodie.parquet.compression.codec="zstd",
  hoodie.log.index.enable="true",
  hoodie.datasource.write.hive_style_partitioning="true"
  )
  ```
  
- COW表
  ```
  create table hudi_cow(业务字段) using hudi options(
  primaryKey="主键字段"
  )
  ```
  COW表只需要上述1个参数，它自动补充以下参数去设置preCombineField属性为主键字段(联合主键会取第一个作为preCombineField)、设置索引为SIMPLE、设置Parquet文件的压缩格式为zstd。上述建表语句实现的效果等价于：
  ```
  create table hudi_cow(业务字段) using hudi options(
  type="cow",
  primaryKey="主键字段",
  preCombineField="主键字段",
  hoodie.index.type="SIMPLE",
  hoodie.parquet.compression.codec="zstd"
  )
  ```
  
 
- Bulk Insert写入（数据纯新增写入，不更新存量） insert into和insert overwrite只需要在insert语句前set hoodie.datasource.write.operation=bulk_insert即可开启，效果等价于：
  ```
  set hoodie.datasource.write.operation=bulk_insert;
  set hoodie.bucket.support.bulk.insert=true;
  set hoodie.combine.before.insert=true;
  set hoodie.bulkinsert.sort.mode=NONE;
  insert into ......
  ```
  

- 表服务托管 如果MRS集群有LDMS服务，MOR表和COW表在建表时可以添加**hoodie.managed.by.ldms="true"**，这些表的Compaction/Clean/Archive将由LDMS服务自己维护。
  
#### Flink场景
- MOR表
  ```
  create table hudi_mor (业务字段)
  with (
  'connector'='hudi',
  'path' = 'hdfs://hacluster/tmp/hudi/stream_mor',
  'table.type'='MERGE_ON_READ',
  'hoodie.datasource.write.recordkey.field'='主键字段',
  'hoodie.bucket.index.num.buckets'='20',
  'hoodie.managed.by.ldms'='true',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = '要同步到Hive的表名',
  'hive_sync.db' = '要同步到Hive的数据库名',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'Hive客户端hive-site.xml文件中hive.metastore.uris的值',
  'properties.hive.metastore.kerberos.principal' = 'Hive客户端hive-site.xml文件中hive.metastore.kerberos.principal的值'
  )
  ```
  Flink写MOR表的场景，**如果MRS集群有LDMS服务** ，则可以在Sink Hudi表的With属性里添加**hoodie.managed.by.ldms**配置（必须同时配置Hive同步），它会自动设置当前MOR表只生成Compaction计划并关闭Clean和Archive，交给LDMS服务来托管该表的Compaction/Clean/Archive维护操作。并且它还会自动补充以下参数去设置write.precombine.field属性为主键字段(联合主键会取第一个作为write.precombine.field)、设置索引为BUCKET、设置写入方式为LSM、设置Parquet文件的压缩格式为zstd以及开启Log文件的Log Index，这些能力会提升读写性能和存储优化。上述建表语句实现的效果等价于：
  ```
  create table hudi_mor (业务字段)
  with (
  'connector'='hudi',
  'path' = 'hdfs://hacluster/tmp/hudi/stream_mor',
  'table.type'='MERGE_ON_READ',
  'hoodie.datasource.write.recordkey.field'='主键字段',
  'write.precombine.field'='主键字段',
  'index.type'='BUCKET',
  'hoodie.bucket.index.num.buckets'='20',
  'hoodie.managed.by.ldms'='true',
  'hoodie.lsm.style'='true',
  'hoodie.parquet.compression.codec'='zstd',
  'hoodie.log.index.enable'='true',
  'hoodie.datasource.write.hive_style_partitioning'='true',
  'compaction.delta_commits'='10',
  'compaction.async.enabled'='false',
  'compaction.schedule.enabled'='true',
  'clean.async.enabled'='false',
  'hoodie.clean.automatic'='false',
  'hoodie.archive.automatic'='false',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = '要同步到Hive的表名',
  'hive_sync.db' = '要同步到Hive的数据库名',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'Hive客户端hive-site.xml文件中hive.metastore.uris的值',
  'properties.hive.metastore.kerberos.principal' = 'Hive客户端hive-site.xml文件中hive.metastore.kerberos.principal的值'
  )
  ```
  
 
- COW表
  ```
  create table hudi_cow (业务字段,PRIMARY KEY (主键字段) NOT ENFORCED)
  with (
  'connector'='hudi',
  'path' = 'hdfs://hacluster/tmp/hudi/stream_cow',
  'hoodie.managed.by.ldms'='true',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = '要同步到Hive的表名',
  'hive_sync.db' = '要同步到Hive的数据库名',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'Hive客户端hive-site.xml文件中hive.metastore.uris的值',
  'properties.hive.metastore.kerberos.principal' = 'Hive客户端hive-site.xml文件中hive.metastore.kerberos.principal的值'
  )
  ```
  Flink写COW表的场景，**如果MRS集群有LDMS服务** ，则可以在Sink Hudi表的With属性里添加**hoodie.managed.by.ldms**配置（必须同时配置Hive同步），它会自动关闭COW表的Clean和Archive，交给LDMS服务来托管该表的Clean和Archive维护操作。并且它还会自动补充以下参数去设置write.precombine.field属性为主键字段(联合主键会取第一个作为write.precombine.field)、设置索引为MEMORY、设置Parquet文件的压缩格式为zstd。上述建表语句实现的效果等价于：
  ```
  create table hudi_cow (业务字段,PRIMARY KEY (主键字段) NOT ENFORCED)
  with (
  'connector'='hudi',
  'path' = 'hdfs://hacluster/tmp/hudi/stream_cow',
  'write.operation' = 'upsert', --默认是更新模式，可设置为insert开启append模式
  'index.type' = 'MEMORY',
  'write.precombine.field'='主键字段',
  'hoodie.parquet.compression.codec'='zstd',
  'hoodie.managed.by.ldms'='true',
  'clean.async.enabled'='false',
  'hoodie.clean.automatic'='false',
  'hoodie.archive.automatic'='false',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = '要同步到Hive的表名',
  'hive_sync.db' = '要同步到Hive的数据库名',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'Hive客户端hive-site.xml文件中hive.metastore.uris的值',
  'properties.hive.metastore.kerberos.principal' = 'Hive客户端hive-site.xml文件中hive.metastore.kerberos.principal的值'
  )
  ```
  

- Append模式写入（数据纯新增写入，不更新存量） Append模式写入就使用COW表，再搭配[高性能小文件合并命令](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300716.html#mrs_01_300716)和LDMS来自动托管Clean/Archive。
  ```
  create table hudi_cow (业务字段,PRIMARY KEY (主键字段) NOT ENFORCED)
  with (
  'connector'='hudi',
  'path' = 'hdfs://hacluster/tmp/hudi/stream_cow',
  'write.operation' = 'insert',
  'hoodie.managed.by.ldms'='true',
  'hive_sync.enable' = 'true',
  'hive_sync.table' = '要同步到Hive的表名',
  'hive_sync.db' = '要同步到Hive的数据库名',
  'hive_sync.mode' = 'hms',
  'hive_sync.metastore.uris' = 'Hive客户端hive-site.xml文件中hive.metastore.uris的值',
  'properties.hive.metastore.kerberos.principal' = 'Hive客户端hive-site.xml文件中hive.metastore.kerberos.principal的值'
  )
  ```
  
 
