
# Hudi表使用约束
#### Hudi表类型
- **Copy On Write**
  写时复制表也简称COW表，使用parquet文件存储数据，内部的更新操作需要通过重写原始parquet文件完成。
  - 优点：读取时，只读取对应分区的一个数据文件即可，较为高效。
  
  - 缺点：数据写入的时候，需要复制一个先前的副本再在其基础上生成新的数据文件，这个过程比较耗时。且由于耗时，读请求读取到的数据相对就会滞后。
   

- **Merge On Read**
  读时合并表也简称MOR表，使用列格式parquet和行格式Avro两种方式混合存储数据。其中parquet格式文件用于存储基础数据，Avro格式文件（也可叫做log文件）用于存储增量数据。
  - 优点：由于写入数据先写delta log，且delta log较小，所以写入成本较低。
  
  - 缺点：需要定期合并整理compact，否则碎片文件较多。读取性能较差，因为需要将delta log和老数据文件合并。
  
  
  表1两种表类型的 trade-off 
  | Trade-off                      | CopyOnWrite    | MergeOnRead        |
  |:---|:---|:---|
  | Data Latency（数据时延）             | 高              | 低                  |
  | Query Latency（查询时延）            | 低              | 高                  |
  | Update cost (I/O)（更新时（I/O）开销）  | 高（重写整个parquet） | 低                  |
  | Parquet File Size（Parquet文件大小） | 小（更新时（I/O）开销大） | 大（更新时开销小）          |
  | Write Amplification（写放大）       | 高              | 低（取决于compaction策略） |
     
  
 
#### Hudi表使用约束与限制
- Hudi支持使用Spark SQL操作Hudi的DDL/DML的语法。但在使用DLI提供的元数据提交SparkSQL作业时，部分直接操作OBS路径的SQL语法暂不支持，详细说明请参考[DLI Hudi SQL语法参考](https://support.huaweicloud.com/sqlref-hudi-dli/dli_hudi_0031.html)。
- 创建Hudi表时，必须且需要正确配置 primaryKey 和 preCombineField，否则存在数据最终表现与预期不一致的风险。
- **使用由DLI提供的元数据服务时，不支持创建DLI表，只支持创建OBS表，即必须通过LOCATION参数配置表路径。**
- 使用由LakeFormation提供的元数据服务时，创建内表和外表均支持。需要注意：在DROP内表时，数据也会被同步删除。
- 在提交Spark SQL或Flink SQL作业时，无需手动配置Hudi的 hoodie.write.lock.provider 配置项，但在提交Spark jar作业时必须手动配置，请见 [Hudi锁配置说明](https://support.huaweicloud.com/sqlref-hudi-dli/dli_hudi_0069.html) 一节。
- Hudi和队列计算引擎的版本对应关系为：
  
  | 计算引擎  | 版本    | Hudi版本 |
  |:---|:---|:---|
  | Spark | 3.3.1 | 0.11.0 |
  | Flink | 1.15  | 0.11.0 |
     
  如何判断队列支持的计算引擎版本：首先进入DLI的控制台界面，点击左侧菜单栏的"资源管理"-\> "队列管理"。在队列管理的界面筛选并选中需要查询的队列，随后点击窗口底部的窗格，展开隐藏的队列详情页面，在支持版本即可查看可用的计算引擎版本。对于SQL队列，无法切换版本，查看默认版本即可判断当前使用的计算引擎版本。
  
 
