更新时间:2024-05-28 GMT+08:00

创建高查询性能的CarbonData表

操作场景

本章节根据超过50个测试用例总结得出建议,帮助用户创建拥有更高查询性能的CarbonData表。

表1 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');