这篇文档主要介绍 Doris 聚合模型上基于导入的更新。

所有列更新

使用 Doris 支持的 Stream Load,Broker Load,Routine Load,Insert Into 等导入方式,往聚合模型(Agg 模型)中进行数据导入时,都会将新的值与旧的聚合值,根据列的聚合函数产出新的聚合值,这个值可能是插入时产出,也可能是异步 Compaction 时产出,但是用户查询时,都会得到一样的返回值。

聚合模型的部分列更新

Aggregate 表主要在预聚合场景使用而非数据更新的场景使用,但也可以通过将聚合函数设置为 REPLACE_IF_NOT_NULL 来实现部分列更新效果。

建表

将需要进行列更新的字段对应的聚合函数设置为REPLACE_IF_NOT_NULL

  1. CREATE TABLE order_tbl (
  2. order_id int(11) NULL,
  3. order_amount int(11) REPLACE_IF_NOT_NULL NULL,
  4. order_status varchar(100) REPLACE_IF_NOT_NULL NULL
  5. ) ENGINE=OLAP
  6. AGGREGATE KEY(order_id)
  7. COMMENT 'OLAP'
  8. DISTRIBUTED BY HASH(order_id) BUCKETS 1
  9. PROPERTIES (
  10. "replication_allocation" = "tag.location.default: 1"
  11. );
  12. +----------+--------------+--------------+
  13. | order_id | order_amount | order_status |
  14. +----------+--------------+--------------+
  15. | 1 | 100 | 待付款 |
  16. +----------+--------------+--------------+
  17. 1 row in set (0.01 sec)

数据写入

无论是 Stream Load、Broker Load、Routine Load 还是INSERT INTO, 直接写入要更新的字段的数据即可

示例

与前面例子相同,对应的 Stream Load 命令为(不需要额外的 header):

  1. curl --location-trusted -u root: -H "column_separator:," -H "columns:order_id,order_status" -T /tmp/update.csv http://127.0.0.1:48037/api/db1/order_tbl/_stream_load

对应的INSERT INTO语句为(不需要额外设置 session variable):

  1. INSERT INTO order_tbl (order_id, order_status) values (1,'待发货');

部分列更新使用注意

Aggregate Key 模型在写入过程中不做任何额外处理,所以写入性能不受影响,与普通的数据导入相同。但是在查询时进行聚合的代价较大,典型的聚合查询性能相比 Unique Key 模型的 Merge-on-Write 实现会有 5-10 倍的下降。

用户无法通过将某个字段由非 NULL 设置为 NULL,写入的 NULL 值在REPLACE_IF_NOT_NULL聚合函数的处理中会自动忽略。