
# 确定写入方式
#### 写入方式介绍
| 写入方式                   | 支持的表类型  | 功能介绍                                                                                                                                                                                                                                                                | 使用介绍                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 优选场景                                                                                                                               |
|:---|:---|:---|:---|:---|
| insert into            | cow/mor | insert into写入的数据将会按主键去更新表内的存量数据。                                                                                                                                                                                                                                    | - insert into SinkTable values()  - insert into SinkTable select \* from SourceTable                                                                                                                                                                                                                                                                                                               | 多源表关联查询后的结果写Hudi表。                                                                                                                 |
| insert overwrite       | cow/mor | - 对于分区表，仅会覆盖写入数据所对应的分区。  - 对于无分区表，整表覆盖。                                                          | - insert overwrite SinkTable values()  - insert overwrite SinkTable select \* from SourceTable                                                                                                                                                                                                                                                                                                     | cow表，分区覆盖。                                                                                                                         |
| insert overwrite table | cow/mor | 可以整表覆盖，也可以分区覆盖。                                                                                                                                                                                                                                                     | - insert overwrite table SinkTable values()  - insert overwrite table SinkTable select \* from SourceTable  - insert overwrite table SinkTable partition (分区字段=分区值) values()  - insert overwrite table SinkTable partition (分区字段=分区值) select \* from SourceTable   | 整表覆盖。                                                                                                                              |
| bulk_insert            | cow/mor | - 给insert into设置bulk_insert方式写入，Hudi表可借助此方式完成快速初始化。  - bulk_insert在迁移存量过程中**只能** **使用一次** ，而且**不去重**。   | 参考[常用参数介绍及使用场景](https://support.huaweicloud.com/devg-rule-mrs/mrs_07_450208.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Hudi表初始化。                                                                                                                          |
| update                 | cow/mor | 批量更新列。                                                                                                                                                                                                                                                              | - update SinkTable set 字段名=值 where 字段名=值                                                                                                                                                                                                                                                                                                                                                                                                                       | 批量地对某一列的值进行更新。                                                                                                                     |
| merge into             | cow/mor | 一条语句完成update/insert/delete多种写入。                                                                                                                                                                                                                                     | - merge into SinkTable as t1 using (子查询) as t2 on t1.字段 = t2.字段 when matched then                                                                                                                                                                                                                                                                                                                                                                              | 不推荐使用Hudi社区的MergeInto能力，可能会存在数据一致性问题，已识别到的问题场景有先执行Delete再执行MergeInto，可能还存在其它场景有问题，建议使用InsertInto/InsertOverwrite/Update/Delete来替代。 |
| delete                 | cow/mor | 小批量删除数据。                                                                                                                                                                                                                                                            | - delete from SinkTable where 字段名=值  - delete from SinkTable where 字段名 in (子查询)                                                                                                                                                                                                                                                                                                             | 小批量删除数据，如删除表中30%以下的数据。                                                                                                             |
   
#### 注意事项
- delete不用来删除分区，删除分区请用drop partition命令，具体请参考[常用SQL介绍](https://support.huaweicloud.com/devg-rule-mrs/mrs_07_450209.html)。
- 对于bucket索引，写入任务可能会遇到重复Bucket ID的报错"Find multiple files at partition xxx belongs to the same bucket id = xxx"。 常见的报错场景：
  1. insert into作业与truncate冲突，truncate正在重新初始化Hudi表，但是insert into作业此时正在写文件，导致重新初始化出来的hudi表里残留上一次insert into作业的文件。
  
  2. insert overwrite作业切换为insert into作业，insert overwrite作业写Hudi时clean和archive的配置必须按照[选择合适的表服务执行方式](https://support.huaweicloud.com/devg-rule-mrs/mrs_07_450207.html)的指导正确去使用，否则insert overwrite作业的replacecommit元数据已经被归档，但是数据文件还在。
   
 
