上云无忧 > 文档中心 > 百度数据仓库 Palo 数据更新
百度数据仓库 Palo Doris版
百度数据仓库 Palo 数据更新

文档简介:
PALO 中存储的数据都是以追加(Append)的方式进入系统,这意味着所有已写入的数据是不可变更的。 所以 PALO 采用标记的方式来实现数据更新的目的。即在一批更新数据中,将之前的数据标记为删除,并写入新的数据。
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

PALO 中存储的数据都是以追加(Append)的方式进入系统,这意味着所有已写入的数据是不可变更的。

所以 PALO 采用标记的方式来实现数据更新的目的。即在一批更新数据中,将之前的数据标记为删除,并写入新的数据。

在读取过程中,PALO 会自动处理这些标记数据(Merge-on-Read),保证用户读取到的是最新的数据。同时,PALO 后台的数据合并(Compaction)线程也会不断的对数据进行合并,消除标记数据,以减少在读取过程中需要进行的合并操作,加速查询。

大部分对数据修改的场景仅适用于 Unique Key 数据模型,因为只有该模型可以保证主键的唯一性,从而支持按主键对数据进行更新。

本文档主要介绍如何使用 Unique Key 数据模型来进行数据更新操作。

数据更新

关于 UNIQUE KEY 的说明,请参阅相关文档。这里不再赘述。下面仅举例说明。

  1. 创建一张 UNIQUE KEY 模型的表

    CREATE TABLE order_table ( order_id BIGINT, order_type VARCHAR(8), order_status VARCHAR(32) 
  2. ) UNIQUE KEY(order_id) DISTRIBUTED BY HASH(order_id) BUCKETS 8;
  3. 导入第一批数据

    1000, TYPE#1, PAID
    1001, TYPE#2, PENDING
    1002, TYPE#3, PAID
  4. 将 ID 为 1001 的订单条目的 order_status 字段修改为 PAID,则需导入以下数据:

    1001, TYPE#2, PAID

    PALO 会根据主键 1001,则读取或者后台合并过程中,将这个条目的 order_status 字段替换为 PAID。

更新部分字段

在上一个例子中,我们仅需要更新 order_status 字段,但是导入的数据中却需要包含 order_type 字段。

在某些场景下,用户无法获取全列数据,仅知道主键和部分要更新的字段的值。在这种情况下,我们可以通过 REPLACE_IF_NOT_NULL 这种聚合方式来实现。

REPLACE_IF_NOT_NULL 表示,当遇到 null 值则不更新。举例如下:

  1. 创建一张 AGGREGATE KEY 模型的表,使用 REPLACE_IF_NOT_NULL 方式。

    CREATE TABLE order_table ( order_id BIGINT, order_type VARCHAR(8) REPLACE_IF_NOT_NULL, order_status VARCHAR(32)

    注意这里我们需要使用 AGGREGATE KEY 数据模型,并且将所有 Value 列的聚合方式设置为 REPLACE_IF_NOT_NULL。

  2.  REPLACE_IF_NOT_NULL ) AGGREGATE KEY(order_id) DISTRIBUTED BY HASH(order_id) BUCKETS 8;
  3. 导入第一批数据

    1000, TYPE#1, PAID
    1001, TYPE#2, PENDING
    1002, TYPE#3, PAID
  4. 将 ID 为 1001 的订单条目的 order_status 字段修改为 PAID,则需导入以下数据:

    1001, \N, PAID

    原始数据中的 \N 即表示 null。PALO 会根据主键 1001,则读取或者后台合并过程中,将这个条目的 order_status 字段替换为 PAID。并且因为 order_type 字段为 null,所以该字段不会被替换。

更新顺序

PALO 内部仅能够保证两个批次的导入数据中,后一批次的数据覆盖更新前一批次的数据。但是如果在同一批次数据中,如果出现主键相同的多行记录,PALO 是无法识别哪一条才是最终生效数据的。

假设某一批次的导入数据如下:

1000, TYPE#1, PENDING
1001, TYPE#2, PENDING
1000, TYPE#3, PAID

注意第一行和第三行主键相同,因此无法确定哪一条会生效,用户最终查询 1000 这个订单的状态,可能为 PENDING,也可能为 PAID。

要解决这个问题,需要业务侧保证在同一批次数据中,没有主键相同的行。或者需参考 Sequence Column 对数据进行适配。

相似文档
  • PALO 中的数据删除有以下几种方式: TRUNCATE,该命令用于直接清空表或分区,但不会删除对应的元数据。操作代价较低,再有清空数据需求时,建议使用。 DROP,删除表或分区,会同时删除数据和元数据。
  • 标记删除功能是对 DELETE 语句删除功能的一种补充。使用 DELETE 语句对数据删除,无法支持高频操作场景。 另外,类似于CDC(Change Data Capture)场景中,INSERT 和 DELETE 一般是穿插出现的。 标记删除功能就是为了支持以上两种场景而做的功能。
  • UNIQUE KEY 模型下,PALO 会根据主键自动的进行数据的更新。但是当同一批次导入数据中出现相同主键的行时,PALO 无法判断其先后顺序,则可能出现更新行为不一致的问题。 而在某些数据同步场景下,需要保证数据能够按顺序更新,而 Sequence Column 功能就是为了解决这一问题。
  • 某些情况下,用户希望将 PALO 中的数据导出到其他系统做进一步分析。 PALO 目前支持通过以下方式将数据导出: Export: EXPORT 命令主要用于将全表(或指定分区)的内容导出到远端存储,比如 BOS 上。 该方式目前仅支持指定表或分区进行全量的导出。不支持对导出结果进行映射、过滤或转换操作。导出格式为 CSV。
  • 全量数据导出(Export)是 PALO 提供的一种将数据导出的功能。 该功能可以将用户指定的表或分区的数据,以文本的格式,通过 Broker 进程导出到远端存储上,如 HDFS/BOS 等。 本文档主要介绍 Export 功能的基本使用方式。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部