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 │ └─────────┘