创建CarbonData Table的建议
操作场景
本章节根据超过50个测试用例总结得出建议,帮助用户创建拥有更高查询性能的CarbonData表。
| 
        Column name  | 
      
        Data type  | 
      
        Cardinality  | 
      
        Attribution  | 
     
|---|---|---|---|
| 
        msisdn  | 
      
        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第一列。
例如,msisdn作为过滤条件在查询中使用的最多,则将其放在第一列。创建表的命令如下,其中采用msisdn作为过滤条件的查询性能将会很好。
create table carbondata_table( msisdn String, ... )STORED AS carbondata TBLPROPERTIES ('SORT_COLUMS'='msisdn'); - 如果待创建的表有多个常用于过滤的列。
    
    
为常用的过滤列创建索引。
例如,如果msisdn,host和dime_1是过滤经常使用的列,根据cardinality,sort_columns列的顺序是dime_1-> host-> msisdn…。创建表命令如下,以下命令可提高dime_1,host和msisdn上的过滤性能。
create table carbondata_table( dime_1 String, host String, msisdn String, dime_2 String, dime_3 String, ... )STORED AS carbondata TBLPROPERTIES ('SORT_COLUMS'='dime_1,host,msisdn'); - 如果每个用于过滤的列的频率相当。
    
    
sort_columns按照cardinality从低到高的顺序排列。
创建表的命令如下:
create table carbondata_table( Dime_1 String, BEGIN_TIME bigint, HOST String, MSISDN String, ... )STORED AS carbondata TBLPROPERTIES ('SORT_COLUMS'='dime_2,dime_3,dime_1, BEGIN_TIME,host,msisdn'); - 按照维度的cardinality从低到高创建表后,再为高Cardinality列创建SECONDARY INDEX。创建索引的语句如下:
    
create index carbondata_table_index_msidn on tablecarbondata_table ( MSISDN 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, MSISDN 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, MSISDN 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');