存储
基于hdfs或者s3等云存储
表类型
主键表
Merge Engines :数据merge方式
- Deduplicate:默认配置,只保留最新的记录,其他的同 PK 数据则被丢弃。
- Partial Update:部分更新表引擎,最终实现一行完整的数据的更新,适用拉宽表场景。
- Aggregation:聚合表引擎,类似doris聚合表。
CREATE TABLE MyTable (
product_id BIGINT,
price DOUBLE,
sales BIGINT,
PRIMARY KEY (product_id) NOT ENFORCED
) WITH (
'merge-engine' = 'aggregation',
'fields.price.aggregate-function' = 'max',
'fields.sales.aggregate-function' = 'sum'
);
仅追加表(Append Only Table)
- Bucketing:未分区的表或分区表中的分区被细分为桶,为数据提供额外的结构,可用于更高效的查询。通常,每个bucket中的推荐数据大小约为1GB。可以为仅追加表定义bucket编号.建议设置bucket key字段。否则,数据将按照整行进行哈希,性能会很差。当我们采用 Paimon 来构建 AppendOnly 表时,数据不仅可以实时写入,还可以实时读取,读写顺序一致,而且实时资源消耗也降低了不少完全可以替换部分消息队列的场景,达到解耦和降本增效的效果。
CREATE TABLE if not exists paimon.ods.event_log(
.......
)
PARTITIONED BY (......)
WITH (
'bucket' = '100',
'bucket-key' = 'uuid',
'snapshot.time-retained' = '7 d',
'write-mode' = 'append-only'
);
INSERT INTO paimon.ods.event_log
SELECT
.......
FROM
realtime_event_kafka_source
;
基本概念
Snapshot
快照捕获表在某个时间点的状态。用户可以通过最新的快照来访问表的最新数据。通过时间旅行,用户还可以通过较早的快照访问表的先前状态。
Partition
Paimon 采用与 Apache Hive 相同的分区概念来分离数据。
分区是一种可选方法,可根据日期、城市和部门等特定列的值将表划分为相关部分。每个表可以有一个或多个分区键来标识特定分区。
通过分区,用户可以高效地操作表中的一片记录。
如果定义了主键,则分区键必须是主键的子集。
Bucket
未分区表或分区表中的分区被细分为存储桶,以便为可用于更有效查询的数据提供额外的结构。
桶的范围由记录中的一列或多列的哈希值确定。用户可以通过提供bucket-key选项来指定分桶列。如果未指定bucket-key选项,则主键(如果已定义)或完整记录将用作存储桶键。
桶是读写的最小存储单元,因此桶的数量了最大处理并行度。不过这个数字不应该太大,因为它会导致大量小文件和低读取性能。一般来说,建议每个桶的数据大小为1GB左右。