上云无忧 > 文档中心 > 百度数据仓库 Palo 标记删除
百度数据仓库 Palo Doris版
百度数据仓库 Palo 标记删除

文档简介:
标记删除功能是对 DELETE 语句删除功能的一种补充。使用 DELETE 语句对数据删除,无法支持高频操作场景。 另外,类似于CDC(Change Data Capture)场景中,INSERT 和 DELETE 一般是穿插出现的。 标记删除功能就是为了支持以上两种场景而做的功能。
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

标记删除功能是对 DELETE 语句删除功能的一种补充。使用 DELETE 语句对数据删除,无法支持高频操作场景。

另外,类似于CDC(Change Data Capture)场景中,INSERT 和 DELETE 一般是穿插出现的。

标记删除功能就是为了支持以上两种场景而做的功能。

实现原理

标记删除功能仅适用于 UNIQUE KEY 模型的表。其原理是在表中增加了一个隐藏列 __DELETE_SIGN__。该列值为 true,则表示该行为一个删除操作,如果为 false,则表示该行是一个插入操作。该隐藏列的只需要用户在导入数据中添加。

假设表结构如下:

列名 主键
order_id Yes
order_type No
order_status No

我们插入以下三行数据:

1000, TYPE#1, PENDING, false
1001, TYPE#2, PENDING, false
1002, TYPE#3, PENDING, false

其中第四列均为false,即表示这三行都是插入操作。执行后,查询结果为:

order_id order_type order_status
1000 TYPE#1 PENDING
1001 TYPE#2 PENDING
1002 TYPE#3 PENDING

接下来我们再导入两行数据:

1001, TYPE#2, PENDING, true
1002, TYPE#3, PAID, false

第一行是一个删除操作,是将 1001 这个订单id对应的数据删除(TYPE#2, PENDING 两个值在这行数据中无意义,可以随意填写,但必须填写以保证列数匹配)。

第二行是一个插入操作,相当于将 1002 这个订单的状态更新为 PAID。

执行后,查询结果为:

order_id order_type order_status
1000 TYPE#1 PENDING
1002 TYPE#3 PAID

由以上示例可以看出,配合 UNIQUE KEY 模型,可以实现按主键的更新或删除操作。当需要删除时,需要将对应的隐藏列设为 true。而当隐藏列是false时,则操作类似于 UPSERT 操作,即有则更新,无则插入

启用标记删除功能

标记删除功能是 PALO 3.10 版本之后引入的新功能。

在新版本中创建的 UNIQUE KEY 表默认都包含隐藏列。而在之前版本中创建的 UNIQUE KEY 表并不具有隐藏列。对于老版本的表,可以使用以下方式增加隐藏列:

ALTER TABLE tablename ENABLE FEATURE "BATCH_DELETE";

这个操作本质上是一个 Schema Change 操作,执行后,需通过 SHOW ALTER TABLE COLUMN 查看作业执行进度。

如果想确定一个表是否已开启标记删除功能,可以通过 设置一个变量来显示隐藏列

SET show_hidden_columns=true`

之后使用 DESC tablename,如果输出中有 __DELETE_SIGN__ 列,则表示该表已开启标记删除功能。

在导入中使用标记删除功能

在不同的数据导入方式中使用标记删除的方式略有不同。标记删除目前支持以下数据导入方式:

  • STREAM LOAD
  • BROKER LOAD
  • ROUTINE LOAD

在这些导入中使用标记删除功能,都需要添加以下两个属性:

  1. Merge Type

    Merge Type 分为3种,APPEND、DELETE 和 MERGE。默认为 APPEND。

    APPEND 方式和正常导入无异。

    DELETE 方式则表示这一批数据中的每一行都是删除操作。在这种方式下,无需再指定 Delete Label 列。

    MERGE 方式表示这一批数据中混合了插入和删除操作。此时,需要通过指定 Delete Label 列来标识每一行的操作类型。

  2. Delete Label

    Delete Label 用于在 MERGE 方式下,指定数据中的某一列是删除标记列。用户可以指定当这一列为何值时,表示DELETE操作。

具体使用语法请参阅各自的文档,这里仅对不同导入方式进行简单的示例说明。假设原始导入数据如下:

1000,TYPE#1,PENDING,0
1001,TYPE#2,PENDING,0
1002,TYPE#3,PENDING,0
1003,TYPE#2,PENDING,1
1004,TYPE#3,PAID,1

Stream Load

Stream Load 请求如下:

curl --location-trusted -u root \ -H "columns: order_id, order_type, order_status, 
delete_label" \ -H "merge_type: MERGE" \ -H "delete: delete_label=1" \ -T data.txt 
http://host:port/api/testDb/testTbl/_stream_load

这个示例表示第四列为 Delete Label 列,并且当值为1时,表示对应行为删除操作。

Broker Load

LOAD LABEL example_db.my_label ( MERGE DATA INFILE("hdfs://abc.com:8888/user/doris/test/ml/file1") 
INTO TABLE example_tbl COLUMNS TERMINATED BY "," (order_id, order_type, order_status, delete_label)
 DELETE ON delete_label=1 ) WITH BROKER 'bos' ( ... );

这个示例表示第四列为 Delete Label 列,并且当值为1时,表示对应行为删除操作。

Routine Load

CREATE ROUTINE LOAD example_db.job1 ON example_tbl WITH DELETE COLUMNS(order_id, order_type, order_status, 
delete_label) PROPERTIES ( "desired_concurrent_number"="3", "max_batch_interval" = "20", "max_batch_rows" 
= "300000", "max_batch_size" = "209715200", "strict_mode" = "false" ) FROM KAFKA ( ... );

注意这里我们使用的 Merge Type 是 DELETE,因此无需指定 Delete Label,第四列的值不会被使用,所有数据均为删除操作。

注意事项

  1. 因为 PALO 无法保证一批次导入数据内部的顺序性,所以在诸如 CDC 等场景下,如需确保数据前后顺序,需配合 Sequence Column 功能一起使用。

相似文档
  • UNIQUE KEY 模型下,PALO 会根据主键自动的进行数据的更新。但是当同一批次导入数据中出现相同主键的行时,PALO 无法判断其先后顺序,则可能出现更新行为不一致的问题。 而在某些数据同步场景下,需要保证数据能够按顺序更新,而 Sequence Column 功能就是为了解决这一问题。
  • 某些情况下,用户希望将 PALO 中的数据导出到其他系统做进一步分析。 PALO 目前支持通过以下方式将数据导出: Export: EXPORT 命令主要用于将全表(或指定分区)的内容导出到远端存储,比如 BOS 上。 该方式目前仅支持指定表或分区进行全量的导出。不支持对导出结果进行映射、过滤或转换操作。导出格式为 CSV。
  • 全量数据导出(Export)是 PALO 提供的一种将数据导出的功能。 该功能可以将用户指定的表或分区的数据,以文本的格式,通过 Broker 进程导出到远端存储上,如 HDFS/BOS 等。 本文档主要介绍 Export 功能的基本使用方式。
  • PALO 支持通过 INSERT 命令直接将数据写入到 ODBC 外部表,作为数据导出的一种方式。 首先须通过 CREATE ODBC TABLE 名创建一个 ODBC 外部表。 之后可以通过如下命令将数据写入外部表: INSERT INTO extern_tbl VALUES(1, 2, 3); INSERT INTO extern_tbl SELECT * FROM other_tbl;
  • 本文档介绍如何使用 SELECT INTO OUTFILE 命令进行查询结果的导出操作。 功能介绍: SELECT INTO OUTFILE 语句可以将查询结果导出到文件中。 目前支持通过 Broker 进程导出到远端存储,如 HDFS,S3,BOS 上。或者直接导出到 Compute Node 所在节点的本地磁盘上(云上用户不支持)。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部