内容纲要
概要描述
本案例详细介绍 hyperdrive 表使用 splitkey 预分 region 的方法。
TDH 6.2.2 以及以上版本。
详细说明
- 基于原始数据采样,并存入表中;
- 基于采样表生成 splitkey;
- 使用 splitkey 创建表,达到预分 region 的效果
假设原始数据表是 store_people
1、基于原始数据采样,并写入表中
采样表即用来保存采样的结果,采样表列中必须包含 所有 用来生成rowkey的源表字段;
例如,源表中的 idcard 字段会用来生成目标表的 rowkey:
create table sample_table
(idcard STRING)
STORED AS ORC;
根据原始数据收集采样结果,并写入表中:
INSERT INTO TABLE sample_table SELECT sample(20618,idcard) FROM store_people;
— 说明:
— Inceptor提供了sample函数用来生成splitkey;
— sample函数接受至少2个参数,第1个参数是采样率,采样率=数据条数/97/预分region数
— 样例数据有10000000条,预分5个region,因此采样率=10000000/97/5,即采样率为20618;
— 后面的参数为采样表中的列名;
— 用户需要根据自身业务场景和实际数据量,确定导入后目标表的rowkey,region数量;
2、通过采样生成 splitkey
将查询结果记录下来,下一步需要使用这些splitkey创建目标表:
select splitkey from (
select max(c) as splitkey from (
select idcard c, ntile(5) over (order by idcard) nt from sample_table ) group by nt
) order by splitkey LIMIT 4;
- 说明:
- ntile函数的参数即为预分region的数量;
- limit的数量是预分region数量减一;
最终获取到的splitkey如下图所示:
3、使用 Inceptor 建立 hyperdrive 表的映射表
根据上一步骤得到的 splitkey 创建 hyperdrive 表:
DROP TABLE sqlbulkload_test;
CREATE TABLE sqlbulkload_test
(key STRING
, name STRING
, sex STRING
, nation STRING
, b_date BIGINT
, phone STRING
, email STRING
, addr STRING)
STORED AS HYPERDRIVE
TBLPROPERTIES(
-- 这里一定要注意,splitkey 是用 "" 包裹的字符串,不能省略 ""
'hyperdrive.table.splitkey'='"230124199501014575","362430200912311849","432501200001010756","522527199001014861"',
'COMPRESSION'='SNAPPY');
使用 bulkload 的方式从源表中将数据导入目标表,此处必须基于 serverkey 排序,也就是 sql 中要加 order by key 字段
insert into table sqlbulkload_test
select /*+USE_BULKLOAD*/
idcard key,name STRING,sex STRING,nation STRING,
b_date BIGINT,phone STRING,email STRING,addr STRING
from store_people order by key;