You need to enable JavaScript to run this app.
导航
最佳实践:ByteHouse 列缺省值
最近更新时间:2024.05.30 21:19:41首次发布时间:2024.05.30 21:19:41

ByteHouse 支持定义一个列的缺省值,无需插入和导入数据,该列可以按照规则自动填充数据。

应用场景

分片导出

将ByteHouse作为一个数据源,采用DataSail将ByteHouse中的数据导出到其他平台,DataSail 支持选择一个分片键(必须为数字类型)将数据划分为若干份,然后并发读取数据,加快导出速度。
当表中没有合适的字段作为分片键时,可以定义一个列用缺省值来填充,填充内容为HASH取模或者随机值,然后将虚拟列用作分片键,从而实现并发导出。

使用举例

我们以rand () 随机函数为例,作为数据表某一列的默认值,其作用为返回一个UInt32类型的随机数字。

根据需求对随机数取模

假设我们想根据用户表的规模来限定随机数的范围,我们可以定义个default 列,默认生成随机值然后 hash 取模,取模的大小根据需求的规模而定。

`ext_key` Int32 DEFAULT cityHash64(rand()) % 1000000 

假设存在一个名为testDB的数据库,我们可以根据下面两个建表语句来建一个分布表。

CREATE TABLE testDB.test_default_local on CLUSTER <集群名>
( 
    `id` Int32,
    `ext_key` Int32 DEFAULT cityHash64(rand()) % 1000000
)
ENGINE = MergeTree
ORDER BY id;

CREATE TABLE testDB.test_default  on CLUSTER <集群名> as testDB.test_default_local
ENGINE = Distributed(<集群名>, testDB, test_default_local, cityHash64(id))

在插入数据时,不需要为 DEFAULT 列ext_key赋值。

insert into testDB.test_default_local (id) select number from numbers(1000000); 

按 100000 步长分组,我们可以查询到结果基本是均匀分布的。

SELECT
    floor(ext_key / 100000) AS g,
    count()
FROM testDB.test_default_local 
GROUP BY g
ORDER BY g ASC

Query id: da191201-deb5-41f3-9c13-bce8b1c56382

┌─g─┬─count()─┐
│ 0 │  100559 │
│ 1 │  100117 │
│ 2 │   99703 │
│ 3 │  100213 │
│ 4 │   99702 │
│ 5 │   99890 │
│ 6 │  100042 │
│ 7 │  100041 │
│ 8 │  100278 │
│ 9 │   99455 │
└───┴─────────┘

不取模方式

我们也可以通过在建表的时候设置任意值,照常插入数据后,也可以参考下面的举例查询到数据的分布情况。

CREATE TABLE testDB.test_default_no_mod_local on CLUSTER <集群名>
( 
    `id` Int32,
    `ext_key` Int32 DEFAULT cityHash64(rand()) 
)
ENGINE = MergeTree
ORDER BY id;

CREATE TABLE testDB.test_default_no_mod  on CLUSTER <集群名> as testDB.test_default_no_mod_local
ENGINE = Distributed(<集群名>, testDB, test_default_no_mod_local, cityHash64(id))
insert into testDB.test_default_no_mod_local (id) select number from numbers(1000000); 
SELECT
    floor((ext_key % 1000000) / 100000) AS g,
    count()
FROM testDB.test_default_no_mod_local
GROUP BY g
ORDER BY g ASC

Query id: 3af9e3d3-96ab-4c03-831b-4d6d26917790

┌─g─┬─count()─┐
│ 0 │  100095 │
│ 1 │  100151 │
│ 2 │  100148 │
│ 3 │   99666 │
│ 4 │  100389 │
│ 5 │  100494 │
│ 6 │   99858 │
│ 7 │   99568 │
│ 8 │   99435 │
│ 9 │  100196 │
└───┴─────────┘

SELECT count()
FROM testDB.test_default_no_mod_local
WHERE ((ext_key % 1000000) >= 100000) AND ((ext_key % 1000000) <= 200000)

Query id: b135e252-9669-4a64-8cfe-5594fe79cedb

┌─count()─┐
│  100151 │
└─────────┘