EmmyMiao87 commented on a change in pull request #4579:
URL: https://github.com/apache/incubator-doris/pull/4579#discussion_r486836145
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
Review comment:
```suggestion
#### routine load
```
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
+
+routine load 在`columns` 字段增加映射 映射方式同上,示例如下
+
+```
+ CREATE ROUTINE LOAD example_db.test1 ON example_tbl
+ [WITH MERGE|APPEND|DELETE]
+ COLUMNS(k1, k2, k3, v1, v2, label),
+ WHERE k1 > 100 and k2 like "%doris%"
+ [DELETE ON label=true]
+ PROPERTIES
+ (
+ "desired_concurrent_number"="3",
+ "max_batch_interval" = "20",
+ "max_batch_rows" = "300000",
+ "max_batch_size" = "209715200",
+ "strict_mode" = "false"
+ )
+ FROM KAFKA
+ (
+ "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092",
+ "kafka_topic" = "my_topic",
+ "kafka_partitions" = "0,1,2,3",
+ "kafka_offsets" = "101,0,0,200"
+ );
+```
+
+## 启用批量删除支持
+在新建表时如果 `enable_batch_delete_by_default` 为true 则新建表的都支持批量删除,如果为false
则新建的表默认不支持批量删除功能。
+对于一个不支持批量删除功能的表 如果项要使用批量删除 可以使用如下语句:
+`ALTER TABLE tablename ENABLE FEATURE "BATCH_DELETE"` 来启用批量删除。
+如果确定一个表是否支持批量删除,可以通过 设置一个session variable 来显示隐藏列 `SET
show_hidden_columns=true` ,之后使用`desc tablename`,如果输出中有`__DELETE_SIGN__`
列则支持,如果没有则不支持
+
+## 注意
+1. 由于除stream load 外的导入操作在doris 内部有可能乱序执行,因此在使用`MERGE` 方式导入时如果不是stream load,需要与
load sequence 一起使用,具体的 语法可以参照sequence列 相关的文档
+2. `DELETE ON` 条件只能与 MERGE 一起使用
+
+## 使用示例
Review comment:
是不是可以考虑把使用的流程都展示一下。比如当前需求是什么?然后导入前数据是什么样子的,怎么导入,最后导入后的变化是什么?以及推荐的使用场景?
##########
File path: fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
##########
@@ -76,7 +76,7 @@ public static Builder builder() {
"tables",
TableType.SCHEMA,
builder()
- .column("TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
+ .column(" TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
Review comment:
Without space?
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
Review comment:
```suggestion
#### routine load
```
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
+
+routine load 在`columns` 字段增加映射 映射方式同上,示例如下
+
+```
+ CREATE ROUTINE LOAD example_db.test1 ON example_tbl
+ [WITH MERGE|APPEND|DELETE]
+ COLUMNS(k1, k2, k3, v1, v2, label),
+ WHERE k1 > 100 and k2 like "%doris%"
+ [DELETE ON label=true]
+ PROPERTIES
+ (
+ "desired_concurrent_number"="3",
+ "max_batch_interval" = "20",
+ "max_batch_rows" = "300000",
+ "max_batch_size" = "209715200",
+ "strict_mode" = "false"
+ )
+ FROM KAFKA
+ (
+ "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092",
+ "kafka_topic" = "my_topic",
+ "kafka_partitions" = "0,1,2,3",
+ "kafka_offsets" = "101,0,0,200"
+ );
+```
+
+## 启用批量删除支持
+在新建表时如果 `enable_batch_delete_by_default` 为true 则新建表的都支持批量删除,如果为false
则新建的表默认不支持批量删除功能。
+对于一个不支持批量删除功能的表 如果项要使用批量删除 可以使用如下语句:
+`ALTER TABLE tablename ENABLE FEATURE "BATCH_DELETE"` 来启用批量删除。
+如果确定一个表是否支持批量删除,可以通过 设置一个session variable 来显示隐藏列 `SET
show_hidden_columns=true` ,之后使用`desc tablename`,如果输出中有`__DELETE_SIGN__`
列则支持,如果没有则不支持
+
+## 注意
+1. 由于除stream load 外的导入操作在doris 内部有可能乱序执行,因此在使用`MERGE` 方式导入时如果不是stream load,需要与
load sequence 一起使用,具体的 语法可以参照sequence列 相关的文档
+2. `DELETE ON` 条件只能与 MERGE 一起使用
+
+## 使用示例
Review comment:
是不是可以考虑把使用的流程都展示一下。比如当前需求是什么?然后导入前数据是什么样子的,怎么导入,最后导入后的变化是什么?以及推荐的使用场景?
##########
File path: fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
##########
@@ -76,7 +76,7 @@ public static Builder builder() {
"tables",
TableType.SCHEMA,
builder()
- .column("TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
+ .column(" TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
Review comment:
Without space?
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
Review comment:
```suggestion
#### routine load
```
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
+
+routine load 在`columns` 字段增加映射 映射方式同上,示例如下
+
+```
+ CREATE ROUTINE LOAD example_db.test1 ON example_tbl
+ [WITH MERGE|APPEND|DELETE]
+ COLUMNS(k1, k2, k3, v1, v2, label),
+ WHERE k1 > 100 and k2 like "%doris%"
+ [DELETE ON label=true]
+ PROPERTIES
+ (
+ "desired_concurrent_number"="3",
+ "max_batch_interval" = "20",
+ "max_batch_rows" = "300000",
+ "max_batch_size" = "209715200",
+ "strict_mode" = "false"
+ )
+ FROM KAFKA
+ (
+ "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092",
+ "kafka_topic" = "my_topic",
+ "kafka_partitions" = "0,1,2,3",
+ "kafka_offsets" = "101,0,0,200"
+ );
+```
+
+## 启用批量删除支持
+在新建表时如果 `enable_batch_delete_by_default` 为true 则新建表的都支持批量删除,如果为false
则新建的表默认不支持批量删除功能。
+对于一个不支持批量删除功能的表 如果项要使用批量删除 可以使用如下语句:
+`ALTER TABLE tablename ENABLE FEATURE "BATCH_DELETE"` 来启用批量删除。
+如果确定一个表是否支持批量删除,可以通过 设置一个session variable 来显示隐藏列 `SET
show_hidden_columns=true` ,之后使用`desc tablename`,如果输出中有`__DELETE_SIGN__`
列则支持,如果没有则不支持
+
+## 注意
+1. 由于除stream load 外的导入操作在doris 内部有可能乱序执行,因此在使用`MERGE` 方式导入时如果不是stream load,需要与
load sequence 一起使用,具体的 语法可以参照sequence列 相关的文档
+2. `DELETE ON` 条件只能与 MERGE 一起使用
+
+## 使用示例
Review comment:
是不是可以考虑把使用的流程都展示一下。比如当前需求是什么?然后导入前数据是什么样子的,怎么导入,最后导入后的变化是什么?以及推荐的使用场景?
##########
File path: fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
##########
@@ -76,7 +76,7 @@ public static Builder builder() {
"tables",
TableType.SCHEMA,
builder()
- .column("TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
+ .column(" TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
Review comment:
Without space?
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
Review comment:
```suggestion
#### routine load
```
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
+
+routine load 在`columns` 字段增加映射 映射方式同上,示例如下
+
+```
+ CREATE ROUTINE LOAD example_db.test1 ON example_tbl
+ [WITH MERGE|APPEND|DELETE]
+ COLUMNS(k1, k2, k3, v1, v2, label),
+ WHERE k1 > 100 and k2 like "%doris%"
+ [DELETE ON label=true]
+ PROPERTIES
+ (
+ "desired_concurrent_number"="3",
+ "max_batch_interval" = "20",
+ "max_batch_rows" = "300000",
+ "max_batch_size" = "209715200",
+ "strict_mode" = "false"
+ )
+ FROM KAFKA
+ (
+ "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092",
+ "kafka_topic" = "my_topic",
+ "kafka_partitions" = "0,1,2,3",
+ "kafka_offsets" = "101,0,0,200"
+ );
+```
+
+## 启用批量删除支持
+在新建表时如果 `enable_batch_delete_by_default` 为true 则新建表的都支持批量删除,如果为false
则新建的表默认不支持批量删除功能。
+对于一个不支持批量删除功能的表 如果项要使用批量删除 可以使用如下语句:
+`ALTER TABLE tablename ENABLE FEATURE "BATCH_DELETE"` 来启用批量删除。
+如果确定一个表是否支持批量删除,可以通过 设置一个session variable 来显示隐藏列 `SET
show_hidden_columns=true` ,之后使用`desc tablename`,如果输出中有`__DELETE_SIGN__`
列则支持,如果没有则不支持
+
+## 注意
+1. 由于除stream load 外的导入操作在doris 内部有可能乱序执行,因此在使用`MERGE` 方式导入时如果不是stream load,需要与
load sequence 一起使用,具体的 语法可以参照sequence列 相关的文档
+2. `DELETE ON` 条件只能与 MERGE 一起使用
+
+## 使用示例
Review comment:
是不是可以考虑把使用的流程都展示一下。比如当前需求是什么?然后导入前数据是什么样子的,怎么导入,最后导入后的变化是什么?以及推荐的使用场景?
##########
File path: fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
##########
@@ -76,7 +76,7 @@ public static Builder builder() {
"tables",
TableType.SCHEMA,
builder()
- .column("TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
+ .column(" TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
Review comment:
Without space?
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
Review comment:
```suggestion
#### routine load
```
##########
File path: docs/zh-CN/administrator-guide/load-data/batch-delete-manual.md
##########
@@ -0,0 +1,152 @@
+---
+{
+ "title": "批量删除",
+ "language": "zh-CN"
+}
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# 批量删除
+目前Doris 支持broker load, routine load, stream load 等多种导入方式,对于数据的删除目前只能通过delete
语句进行删除,使用delete 语句的方式删除时,每执行一次delete 都会生成一个新的数据版本,如果频繁删除会严重影响查询性能,并且在使用delete
方式删除时,是通过生成一个空的rowset来记录删除条件实现,每次读取都要对删除跳条件进行过滤,同样在条件较多时会对性能造成影响。对比其他的系统,greenplum
的实现方式更像是传统数据库产品,snowflake 通过merge 语法实现。
+
+对于类似于cdc 数据的导入的场景,数据数据中insert 和delete
一般是穿插出现的,面对这种场景我们目前的导入方式也无法满足,即使我们能够分离出insert 和delete
虽然可以解决导入的问题,但是仍然解决不了删除的问题。使用批量删除功能可以解决这些个场景的需求。
+数据导入有三种合并方式:
+1. APPEND: 数据全部追加到现有数据中
+2. DELETE: 删除所有与导入数据key 列值相同的行
+3. MERGE: 根据 DELETE ON 的决定 APPEND 还是 DELETE
+
+## 原理
+通过增加一个隐藏列`__DELETE_SIGN__`实现,因为我们只是在unique 模型上做批量删除,因此只需要增加一个 类型为bool
聚合函数为replace 的隐藏列即可。在be 各种聚合写入流程都和正常列一样,读取方案有两个:
+
+在fe遇到 * 等扩展时去去掉`__DELETE_SIGN__`,并且默认加上 `__DELETE_SIGN__ != true` 的条件
+be 读取时都会加上一列进行判断,通过条件确定是否删除。
+
+### 导入
+
+导入时在fe 解析时将隐藏列的值设置成 `DELETE ON` 表达式的值,其他的聚合行为和replace的聚合列相同
+
+### 读取
+
+读取时在所有存在隐藏列的olapScanNode上增加`__DELETE_SIGN__ != true` 的条件,be 不感知这以过程,正常执行
+
+### Cumulative Compaction
+
+Cumulative Compaction 时将隐藏列看作正常的列处理,Compaction逻辑没有变化
+
+### Base Compaction
+
+Base Compaction 时要将标记为删除的行的删掉,以减少数据占用的空间
+
+### 语法
+导入的语法设计方面主要是增加一个指定删除标记列的字段的column 映射,并且需要在导入数据中增加这一列,各个导入方式设置的方法如下
+
+#### stream load
+
+stream load 的写法在在header 中的 columns 字段增加一个设置删除标记列的字段, 示例
+` -H "columns: k1, k2, label_c3" -H "merge_type: [MERGE|APPEND|DELETE]" -H
"delete: label_c3=1"`
+
+#### broker load
+
+在`PROPERTIES ` 处设置删除标记列的字段
+
+```
+LOAD LABEL db1.label1
+(
+ [MERGE|APPEND|DELETE] DATA
INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1")
+ INTO TABLE tbl1
+ COLUMNS TERMINATED BY ","
+ (tmp_c1,tmp_c2, label_c3)
+ SET
+ (
+ id=tmp_c2,
+ name=tmp_c1,
+ )
+ [DELETE ON label=true]
+
+)
+WITH BROKER 'broker'
+(
+ "username"="user",
+ "password"="pass"
+)
+PROPERTIES
+(
+ "timeout" = "3600"
+
+);
+
+```
+
+#### reoutine load
+
+routine load 在`columns` 字段增加映射 映射方式同上,示例如下
+
+```
+ CREATE ROUTINE LOAD example_db.test1 ON example_tbl
+ [WITH MERGE|APPEND|DELETE]
+ COLUMNS(k1, k2, k3, v1, v2, label),
+ WHERE k1 > 100 and k2 like "%doris%"
+ [DELETE ON label=true]
+ PROPERTIES
+ (
+ "desired_concurrent_number"="3",
+ "max_batch_interval" = "20",
+ "max_batch_rows" = "300000",
+ "max_batch_size" = "209715200",
+ "strict_mode" = "false"
+ )
+ FROM KAFKA
+ (
+ "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092",
+ "kafka_topic" = "my_topic",
+ "kafka_partitions" = "0,1,2,3",
+ "kafka_offsets" = "101,0,0,200"
+ );
+```
+
+## 启用批量删除支持
+在新建表时如果 `enable_batch_delete_by_default` 为true 则新建表的都支持批量删除,如果为false
则新建的表默认不支持批量删除功能。
+对于一个不支持批量删除功能的表 如果项要使用批量删除 可以使用如下语句:
+`ALTER TABLE tablename ENABLE FEATURE "BATCH_DELETE"` 来启用批量删除。
+如果确定一个表是否支持批量删除,可以通过 设置一个session variable 来显示隐藏列 `SET
show_hidden_columns=true` ,之后使用`desc tablename`,如果输出中有`__DELETE_SIGN__`
列则支持,如果没有则不支持
+
+## 注意
+1. 由于除stream load 外的导入操作在doris 内部有可能乱序执行,因此在使用`MERGE` 方式导入时如果不是stream load,需要与
load sequence 一起使用,具体的 语法可以参照sequence列 相关的文档
+2. `DELETE ON` 条件只能与 MERGE 一起使用
+
+## 使用示例
Review comment:
是不是可以考虑把使用的流程都展示一下。比如当前需求是什么?然后导入前数据是什么样子的,怎么导入,最后导入后的变化是什么?以及推荐的使用场景?
##########
File path: fe/fe-core/src/main/java/org/apache/doris/catalog/SchemaTable.java
##########
@@ -76,7 +76,7 @@ public static Builder builder() {
"tables",
TableType.SCHEMA,
builder()
- .column("TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
+ .column(" TABLE_CATALOG",
ScalarType.createVarchar(FN_REFLEN))
Review comment:
Without space?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]