内容纲要
概要描述
本文主要介绍主键语义下,rowkey表在下面2个参数的作用下的不同体现。
holodesk.rowkey.strategy,表示遇到重复 RowKey 时候应该怎么处理,2个备选值:
- replace(默认值) 表示遇到重复的 RowKey 时,用新的数据覆盖旧的数据
- conflict 表示遇到重复 RowKey 时,直接抛出异常
holodesk.rowkey.unique.scope,表示 RowKey 的作用范围,2个备选值:
- section(默认值),表示 RowKey 在同一个分区内是唯一的,不同的分区可以包含相同的 RowKey
- global,表示 RowKey 是全局唯一的,不同的分区不可以包含相同的 RowKey
详细介绍
1. 分区内唯一,重复值覆盖(默认情况)
holodesk.rowkey.strategy=replace
holodesk.rowkey.unique.scope=section
drop table rk_bigint_1;
CREATE TABLE IF NOT EXISTS rk_bigint_1
(
c1 INT,
c2 STRING
)
partitioned by (p string)
CLUSTERED BY(c1)
STORED AS HOLODESK
TBLPROPERTIES
('holodesk.rowkey'='c1');
insert into rk_bigint_1 select 1,'a','p1';
insert into rk_bigint_1 select 1,'b','p1';
SELECT * FROM rk_bigint_1;
执行不报错,p=p1的分区内,相同rowkey会被replace覆盖掉:
2. 全局唯一
holodesk.rowkey.strategy=conflict
holodesk.rowkey.unique.scope=global
drop table IF EXISTS rk_bigint_2;
CREATE TABLE rk_bigint_2(
c1 int
)partitioned by (p string)
CLUSTERED BY(c1)
STORED AS HOLODESK
TBLPROPERTIES (
'holodesk.rowkey'='c1',
'holodesk.rowkey.strategy'='conflict',
'holodesk.rowkey.unique.scope'='global'
);
--先插入一条数据
insert into rk_bigint_2 select 1,'p1';
--另一个分区,相同rowkey,插入失败 java.lang.RuntimeException: There is a rowKey conflict between the new data and the old data globally.
insert into rk_bigint_2 select 1,'p2';