
# 配置Hudi数据列默认值
#### 操作场景
配置Hudi数据列默认值允许用户在给表新增列时，设置列的默认值。在查询历史数据时，新增列将返回默认值，从而确保数据的一致性和完整性。
通过配置Hudi数据列的默认值，可以在多种场景下确保数据的一致性和完整性。这不仅简化了数据处理和查询逻辑，还提高了数据的质量和业务的稳定性。在实际应用中，根据具体需求选择合适的默认值，可以更好地满足业务需求。
- 历史数据迁移：在数据迁移过程中，需要将旧表的数据迁移到新表中，而新表中新增了一些列。
- 数据模型演进：随着业务的发展，需要在现有表中新增一些列来记录更多的信息。
- 数据备份和恢复：在数据备份和恢复过程中，需要确保备份的数据在恢复后仍然保持一致性和完整性。
- 业务逻辑需求：某些业务逻辑要求某些列在所有数据行中都有值，即使这些值是默认值。
- 数据审计和日志记录：在数据审计和日志记录过程中，需要记录某些列的初始值或默认值。
 
#### 约束与限制
- 本章节仅适用于MRS 3.3.0-LTS及之后版本。
- 新增列在设置默认值前，如果数据已经进行了重写，则查询历史数据不支持返回列的默认值，返回NULL。数据入库、更新、执行Compaction、Clustering都会导致部分或全部数据重写。
- 列的默认值设置要与列的类型一致，如不一致会进行类型强转，导致默认值精度丢失或者默认值为NULL。
- 历史数据的默认值与列第一次设置的默认值一致，多次修改列的默认值不会影响历史数据的查询结果。
- 设置默认值后rollback不能回滚默认值配置。
- Spark SQL暂不支持查看列默认值信息，可以通过Hive beeline执行**show create table**命令查看。
 
#### 支持范围
当前仅支持int、bigint、float、double、decimal、string、date、timestamp、boolean、binary类型，其他类型不支持。
表1引擎支持矩阵 
| 引擎               | DDL操作 | 写操作支持 | 读操作支持 |
|:---|:---|:---|:---|
| SparkSQL         | Y     | Y     | Y     |
| Spark DataSource | N     | N     | Y     |
| Flink            | N     | N     | Y     |
| HetuEngine       | N     | N     | Y     |
| Hive             | N     | N     | Y     |
   
#### 示例
SQL语法具体参考[Hudi SQL语法参考](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24261.html)章节。
示例：
- 建表指定列默认值：
  ```
  create table if not exists h3(
  id bigint,
  name string,
  price double default 12.34
  ) using hudi
  options (
  primaryKey = 'id',
  type = 'mor',
  preCombineField = 'name'
  );
  ```
  

- 添加列指定列默认值：
  ```
  alter table h3 add columns(col1 string default 'col1_value');
  alter table h3 add columns(col2 string default 'col2_value', col3 int default 1);
  ```
  
- 修改列默认值：
  ```
  alter table h3 alter column price set default 14.56;
  ```
  
- 插入数据使用列默认值：
  ```
  insert into h3(id, name) values(1, 'aaa');
  insert into h3(id, name, price) select 2, 'bbb', 12.5;
  ```
  
 
