左侧选择已经同步的表进行相应的列操作,支持order by, key columns, distributed by, partition by, data_model,buckets, replication_num,enable_persistent_index,如果同时设置多个操作,那么操作之间通过“;”连接。
详细的语法可以参考
表3。
表3 操作语法
操作类型 |
具体语法 |
order by |
order by(column1, column2)或者order by column1,column2 |
key columns |
key columns(column1, column2)或者key columns column1,column2 |
distributed by |
distributed by (column1, column2) buckets 3
|
partition by |
分为表达式分区,List分区等。详见分区语法示例。 |
data_model |
用于指定表类型,取值范围可以是主键表(primary key),明细表(deplicate key)或者更新表(unique key)。
具体语法如下:
data_model=primary key或者data_model=duplicate key或者data_model=unique key |
replication_num |
replication_num=3
|
enable_persistent_index |
表示是否持久化索引,具体语法如下:
enable_persistent_index=true或者enable_persistent_index=false |
组合场景 |
data_model=duplicate key;key columns column1, column2; |
分区语法示例:
表达式分区,仅需在建表时设置分区表达式(时间函数表达式或列表表达式)。在数据导入时,HTAP会根据数据和分区表达式的定义规则自动创建分区。
时间函数表达式分区:如果经常按照连续日期范围来查询和管理数据,则只需要在时间函数分区表达式中,指定一个日期类型(DATE或DATETIME)的分区列,以及指定分区粒度(年、月、日、小时),HTAP会根据导入的数据和分区表达式,自动创建分区并设置分区的起止时间。
语法:
PARTITION BY expression
...
[ PROPERTIES( 'partition_live_number' = 'xxx' ) ]
expression ::=
{ date_trunc ( <time_unit> , <partition_column> ) |
time_slice ( <partition_column> , INTERVAL <N> <time_unit> [ , boundary ] ) }
表4 参数说明
参数 |
是否必填 |
说明 |
expression |
是 |
目前仅支持date_trunc和time_slice函数。并且如果您使用 time_slice函数,则可以不传入参数boundary,因为在该场景中该参数默认且仅支持为floor,不支持为ceil。 |
time_unit |
是 |
分区粒度,目前仅支持为hour、day、month或year,暂时不支持为week。如果分区粒度为hour,则仅支持分区列为DATETIME类型,不支持为DATE类型。 |
partition_column |
是 |
分区列。
- 仅支持为日期类型(DATE或DATETIME),不支持为其它类型。如果使用date_trunc函数,则分区列支持为DATE或DATETIME类型。如果使用time_slice函数,则分区列仅支持为DATETIME类型。分区列的值支持为NULL。
- 如果分区列是DATE类型,则范围支持为[0000-01-01 ~ 9999-12-31]。如果分区列是DATETIME类型,则范围支持为[0000-01-01 01:01:01 ~ 9999-12-31 23:59:59]。
- 目前仅支持指定一个分区列,不支持指定多个分区列。
|
示例:假设您经常按天查询数据,则建表时可以使用分区表达式 date_trunc() ,并且设置分区列为 event_day ,分区粒度为 day,实现导入数据时自动按照数据所属日期划分分区。将同一天的数据存储在一个分区中,利用分区裁剪可以显著提高查询效率。
CREATE TABLE site_access1 (
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY date_trunc('day', event_day)
DISTRIBUTED BY HASH(event_day, site_id);
列表达式分区:如果您经常按照枚举值来查询和管理数据,则您只需要指定表示类型的列为分区列,HTAP会根据导入的数据的分区列值,来自动划分并创建分区。
语法:
PARTITION BY expression
...
[ PROPERTIES( 'partition_live_number' = 'xxx' ) ]
expression ::=
( <partition_columns> )
partition_columns ::=
<column>, [ <column> [,...] ]
表5 参数说明
参数 |
是否必填 |
说明 |
partition_columns |
是 |
分区列。
- 支持为字符串(不支持BINARY)、日期、整数和布尔值。不支持分区列的值为NULL。
- 导入后自动创建的一个分区中只能包含各分区列的一个值,如果需要包含各分区列的多值,请使用List分区。
|
示例:假设经常按日期范围和特定城市查询机房收费明细,则建表时可以使用分区表达式指定分区列为日期 dt 和城市 city。这样属于相同日期和城市的数据分组到同一个分区中,利用分区裁剪可以显著提高查询效率。
CREATE TABLE t_recharge_detail1 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY (dt,city)
DISTRIBUTED BY HASH(`id`);
List 分区
数据按照您显式定义的枚举值列表进行分区,适用于按枚举值来查询和管理数据。您需要显式列出每个 List 分区所包含的枚举值列表,并且值不需要连续。
List分区适用于存储具有少量枚举值列的数据、并且经常按列的枚举值来查询和管理数据的场景。例如表示地理位置、状态、类别的列。列的每个值都代表一种独立的类别。按照列的枚举值对数据进行分区,可以提高查询性能和方便数据管理。尤其适用于一个分区中需要包含各分区列的多个值的场景。例如表中存在 City 列表示个体所属的城市,并且您经常按照州和城市查询和管理数据,则建表时可以使用 City 列作为分区列进行 List 分区,指定同属一个州的多个城市的数据分在同一分区 PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego"),可以加速查询和方便数据管理。
必须在建表时就创建分区,导入时不支持自动创建分区,如果表中不存在数据对应的分区,会报错。
语法:
PARTITION BY LIST (partition_columns)(
PARTITION <partition_name> VALUES IN (value_list)
[, ...]
)
partition_columns::=
<column> [,<column> [, ...] ]
value_list ::=
value_item [, value_item [, ...] ]
value_item ::=
{ <value> | ( <value> [, <value>, [, ...] ] ) }
表6 参数说明
参数 |
是否必填 |
说明 |
partition_columns |
是 |
分区列。
分区列的值支持为字符串(除BINARY)、日期(DATE和DATETIME)、整数和布尔值。分区列的值不支持为NULL。 |
partition_name |
是 |
分区名称。
建议您按照业务场景设置合理的分区名称,便于区别不同分区包含的数据分类。 |
value_list |
是 |
分区中分区列的枚举值列表。 |
示例一:假设经常按照州或城市查询机房收费明细,则建表时可以指定分区列为城市city ,并且指定每个分区所包含城市同属一个州,这样可以加速查询特定州或城市的数据,并且方便按照特定州或城市进行数据管理。
CREATE TABLE t_recharge_detail2 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY LIST (city) (
PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego"), -- 这些城市同属一个州
PARTITION pTexas VALUES IN ("Houston","Dallas","Austin")
)
DISTRIBUTED BY HASH(`id`);
示例二:假设经常按日期范围和特定州或城市查询机房收费明细,则建表时可以指定分区列为日期dt和城市city。这样属于特定日期和特定州或城市的数据分组到同一个分区中,以加速查询和方便数据管理。
CREATE TABLE t_recharge_detail4 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
) ENGINE=OLAP
DUPLICATE KEY(id)
PARTITION BY LIST (dt,city) (
PARTITION p202204_California VALUES IN (
("2022-04-01", "Los Angeles"),
("2022-04-01", "San Francisco"),
("2022-04-02", "Los Angeles"),
("2022-04-02", "San Francisco")
),
PARTITION p202204_Texas VALUES IN (
("2022-04-01", "Houston"),
("2022-04-01", "Dallas"),
("2022-04-02", "Houston"),
("2022-04-02", "Dallas")
)
)
DISTRIBUTED BY HASH(`id`);