一、常见数据分布方式
现代分布式数据库中,常见的数据分布方式有如下几种:
·Round-Robin:以轮询的方式把数据逐个放置在相邻节点上。
·Range:按区间进行数据分布。
·List:直接基于离散的各个取值做数据分布,性别、省份等数据就满足这种离散的特性。每个离散值会映射到一个节点上,多个不同的取值可能也会映射到相同节点上。
·Hash:通过哈希函数把数据映射到不同节点上。
为了更灵活地划分数据,除了单独采用上述数据分布方式之一以外,你还可以根据具体的业务场景需求组合使用这些数据分布方式。常见的组合方式有 Hash+Hash、Range+Hash、Hash+List。更多信息请查看文档 数据分布。
二、Random 分布
建表时不设置分区和分桶方式,则默认使用 Random 分布。
CREATE TABLE site_access1 ( event_day DATE, site_id INT DEFAULT 10, pv BIGINT DEFAULT 0 , city_code VARCHAR(100), user_name VARCHAR(32) DEFAULT '')DUPLICATE KEY (event_day,site_id,pv);– 没有设置任何分区和分桶方式,默认为 Random 分布(目前仅支持明细表)
三、Hash 分布
CREATE TABLE site_access2 ( event_day DATE, site_id INT DEFAULT 10, city_code SMALLINT, user_name VARCHAR(32) DEFAULT '', pv BIGINT SUM DEFAULT 0)AGGREGATE KEY (event_day, site_id, city_code, user_name)– 设置分桶方式为哈希分桶,并且必须指定分桶键DISTRIBUTED BY HASH(event_day,site_id);
四、Range + Random 分布
CREATE TABLE site_access3 ( event_day DATE, site_id INT DEFAULT 10, pv BIGINT DEFAULT 0 , city_code VARCHAR(100), user_name VARCHAR(32) DEFAULT '')DUPLICATE KEY(event_day,site_id,pv)– 设为分区方式为表达式分区,并且使用时间函数的分区表达式(当然你也可以设置分区方式为 Range 分区)PARTITION BY date_trunc('day', event_day);– 没有设置分桶方式,默认为随机分桶(目前仅支持明细表)
五、Range + Hash 分布
CREATE TABLE site_access4 ( event_day DATE, site_id INT DEFAULT 10, city_code VARCHAR(100), user_name VARCHAR(32) DEFAULT '', pv BIGINT SUM DEFAULT 0)AGGREGATE KEY(event_day, site_id, city_code, user_name)– 设为分区方式为表达式分区,并且使用时间函数的分区表达式(当然你也可以设置分区方式为 Range 分区)PARTITION BY date_trunc('day', event_day)– 设置分桶方式为哈希分桶,必须指定分桶键DISTRIBUTED BY HASH(event_day, site_id);
六、List + Random 分布
CREATE TABLE t_recharge_detail1 ( id bigint, user_id bigint, recharge_money decimal(32,2), city varchar(20) not null, dt date not null)DUPLICATE KEY(id)– 设为分区方式为表达式分区,并且使用列分区表达式(当然你也可以设置分区方式为 List 分区)PARTITION BY (city);– 没有设置分桶方式,默认为随机分桶(目前仅支持明细表)
七、List + Hash 分布
CREATE TABLE t_recharge_detail2 ( id bigint, user_id bigint, recharge_money decimal(32,2), city varchar(20) not null, dt date not null)DUPLICATE KEY(id)– 设为分区方式为表达式分区,并且使用列分区表达式(当然你也可以设置分区方式为 List 分区)PARTITION BY (city)– 设置分桶方式为哈希分桶,并且必须指定分桶键DISTRIBUTED BY HASH(city,id);