hyperdrive 表使用 splitkey 预分 region

  其他常见问题
内容纲要

概要描述


本案例详细介绍 hyperdrive 表使用 splitkey 预分 region 的方法。
TDH 6.2.2 以及以上版本。

详细说明


  1. 基于原始数据采样,并存入表中;
  2. 基于采样表生成 splitkey;
  3. 使用 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如下图所示:

file

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;

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。