创建高查询性能的CarbonData表
操作场景
本章节根据超过50个测试用例总结得出建议,帮助用户创建拥有更高查询性能的CarbonData表。
Column name |
Data type |
Cardinality |
Attribution |
---|---|---|---|
msname |
String |
3千万 |
dimension |
BEGIN_TIME |
bigint |
1万 |
dimension |
host |
String |
1百万 |
dimension |
dime_1 |
String |
1千 |
dimension |
dime_2 |
String |
500 |
dimension |
dime_3 |
String |
800 |
dimension |
counter_1 |
numeric(20,0) |
NA |
measure |
... |
... |
NA |
measure |
counter_100 |
numeric(20,0) |
NA |
measure |
操作步骤
- 如果待创建的表有一个常用于过滤的列 ,例如80%以上的场景使用此列过滤。
将常用于过滤的列放在sort_columns第一列。
例如,msname作为过滤条件在查询中使用的最多,则将其放在第一列。创建表的命令如下,其中采用msname作为过滤条件的查询性能将会很好。
create table carbondata_table( msname String, ... )STORED AS carbondata TBLPROPERTIES ('SORT_COLUMS'='msname');
- 如果待创建的表有多个常用于过滤的列。
为常用的过滤列创建索引。
例如,如果msname,host和dime_1是过滤经常使用的列,根据cardinality,sort_columns列的顺序是dime_1-> host-> msname…。创建表命令如下,以下命令可提高dime_1,host和msname上的过滤性能。
create table carbondata_table( dime_1 String, host String, msname String, dime_2 String, dime_3 String, ... )STORED AS carbondata TBLPROPERTIES ('SORT_COLUMS'='dime_1,host,msname');
- 如果每个用于过滤的列的频率相当。
sort_columns按照cardinality从低到高的顺序排列。
创建表的命令如下:
create table carbondata_table( Dime_1 String, BEGIN_TIME bigint, HOST String, msname String, ... )STORED AS carbondata TBLPROPERTIES ('SORT_COLUMS'='dime_2,dime_3,dime_1, BEGIN_TIME,host,msname');
- 按照维度的cardinality从低到高创建表后,再为高Cardinality列创建SECONDARY INDEX。创建索引的语句如下:
create index carbondata_table_index_msidn on tablecarbondata_table ( msname String) as 'carbondata' PROPERTIES ('table_blocksize'='128'); create index carbondata_table_index_host on tablecarbondata_table ( host String) as 'carbondata' PROPERTIES ('table_blocksize'='128');
- 对于不需要高精度的度量,无需使用numeric (20,0)数据类型,建议使用double数据类型来替换numeric (20,0)数据类型,以提高查询性能。
在一个测试用例中,使用double来替换numeric (20, 0),查询时间从15秒降低到3秒,查询速度提高了5倍。创建表命令如下:
create table carbondata_table( Dime_1 String, BEGIN_TIME bigint, HOST String, msname String, counter_1 double, counter_2 double, ... counter_100 double, )STORED AS carbondata ;
- 如果列值总是递增的,如start_time。
例如,每天将数据加载到CarbonData,start_time是每次加载的增量。对于这种情况,建议将start_time列放在sort_columns的最后,因为总是递增的值可以始终使用最小/最大索引。创建表命令如下:
create table carbondata_table( Dime_1 String, HOST String, msname String, counter_1 double, counter_2 double, BEGIN_TIME bigint, ... counter_100 double, )STORED AS carbondata TBLPROPERTIES ( 'SORT_COLUMS'='dime_2,dime_3,dime_1..BEGIN_TIME');