CREATE TABLE
在 StarRocks 中创建一张新表。
此操作需要目标数据库的 CREATE TABLE 权限。
语法
CREATE [EXTERNAL] [TEMPORARY] TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...]
[, index_definition1[, index_definition12,]])
[ENGINE = [olap|mysql|elasticsearch|hive|hudi|iceberg|jdbc]]
[key_desc]
[COMMENT "table comment"]
[partition_desc]
[distribution_desc]
[rollup_index]
[ORDER BY (column_name1,...)]
[PROPERTIES ("key"="value", ...)]
关键字
EXTERNAL
EXTERNAL 关键字已弃用。
我们建议您使用外部 Catalog来查询 Hive、Iceberg、Hudi 和 JDBC 数据源中的数据,而不是使用 EXTERNAL 关键字创建外部表。
建议
从 v3.1 起,StarRocks 支持在 Iceberg Catalog 中创建 Parquet 格式的表,并支持使用 INSERT INTO 将数据导入到这些 Parquet 格式的 Iceberg 表中。
从 v3.2 起,StarRocks 支持在 Hive Catalog 中创建 Parquet 格式的表,并支持使用 INSERT INTO 将数据导入到这些 Parquet 格式的 Hive 表中。从 v3.3 起,StarRocks 支持在 Hive Catalog 中创建 ORC 和 Textfile 格式的表,并支持使用 INSERT INTO 将数据导入到这些 ORC 和 Textfile 格式的 Hive 表中。
如果您想使用已弃用的 EXTERNAL 关键字,请展开**EXTERNAL 关键字详情**
EXTERNAL 关键字详情
要创建外部表以查询外部数据源,请指定 CREATE EXTERNAL TABLE 并将 ENGINE 设置为以下任意值。您可以参考外部表了解更多信息。
-
对于 MySQL 外部表,请指定以下属性:
PROPERTIES (
"host" = "mysql_server_host",
"port" = "mysql_server_port",
"user" = "your_user_name",
"password" = "your_password",
"database" = "database_name",
"table" = "table_name"
)注意:
MySQL 中的“table_name”应指真实的表名。相比之下,CREATE TABLE 语句中的“table_name”指此 MySQL 表在 StarRocks 上的名称。它们可以不同,也可以相同。
在 StarRocks 中创建 MySQL 表的目的是访问 MySQL 数据库。StarRocks 本身不维护或存储任何 MySQL 数据。
-
对于 Elasticsearch 外部表,请指定以下属性:
PROPERTIES (
"hosts" = "http://192.168.xx.xx:8200,http://192.168.xx0.xx:8200",
"user" = "root",
"password" = "root",
"index" = "tindex",
"type" = "doc"
)hosts:用于连接 Elasticsearch 集群的 URL。您可以指定一个或多个 URL。user:用于登录已启用基本身份验证的 Elasticsearch 集群的根用户帐户。password:上述根帐户的密码。index:StarRocks 表在 Elasticsearch 集群中的索引。索引名称与 StarRocks 表名相同。您可以将此参数设置为 StarRocks 表的别名。type:索引类型。默认值为doc。
-
对于 Hive 外部表,请指定以下属性:
PROPERTIES (
"database" = "hive_db_name",
"table" = "hive_table_name",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
)此处,database 是 Hive 表中对应数据库的名称。Table 是 Hive 表的名称。
hive.metastore.uris是服务器地址。 -
对于 JDBC 外部表,请指定以下属性:
PROPERTIES (
"resource"="jdbc0",
"table"="dest_tbl"
)resource是 JDBC 资源名称,table是目标表。 -
对于 Iceberg 外部表,请指定以下属性:
PROPERTIES (
"resource" = "iceberg0",
"database" = "iceberg",
"table" = "iceberg_table"
)resource是 Iceberg 资源名称。database是 Iceberg 数据库。table是 Iceberg 表。 -
对于 Hudi 外部表,请指定以下属性:
PROPERTIES (
"resource" = "hudi0",
"database" = "hudi",
"table" = "hudi_table"
)
TEMPORARY
创建临时表。从 v3.3.1 开始,StarRocks 支持在 Default Catalog 中创建临时表。更多信息,请参见临时表。
创建临时表时,您必须将 ENGINE 设置为 olap。
列定义
col_name col_type [agg_type] [NULL | NOT NULL] [DEFAULT "default_value"] [AUTO_INCREMENT] [AS generation_expr]
col_name
请注意,通常您不能创建以 __op 或 __row 开头的列名,因为这些名称格式在 StarRocks 中保留用于特殊目的,创建此类列可能会导致未定义的行为。如果您确实需要创建此类列,请将 FE 动态参数allow_system_reserved_names 设置为 TRUE。
col_type
具体列信息,例如类型和范围:
-
TINYINT (1 字节):范围从 -2^7 + 1 到 2^7 - 1。
-
SMALLINT (2 字节):范围从 -2^15 + 1 到 2^15 - 1。
-
INT (4 字节):范围从 -2^31 + 1 到 2^31 - 1。
-
BIGINT (8 字节):范围从 -2^63 + 1 到 2^63 - 1。
-
LARGEINT (16 字节):范围从 -2^127 + 1 到 2^127 - 1。
-
FLOAT (4 字节):支持科学计数法。
-
DOUBLE (8 字节):支持科学计数法。
-
DECIMAL[(precision, scale)] (16 字节)
-
默认值:DECIMAL(10, 0)
-
精度:1 ~ 38
-
标度:0 ~ 精度
-
整数部分:精度 - 标度
不支持科学计数法。
-
-
DATE (3 字节):范围从 0000-01-01 到 9999-12-31。
-
DATETIME (8 字节):范围从 0000-01-01 00:00:00 到 9999-12-31 23:59:59。
-
CHAR[(length)]:定长字符串。范围:1 ~ 255。默认值:1。
-
VARCHAR[(length)]:变长字符串。默认值为 1。单位:字节。在 StarRocks 2.1 之前的版本中,
length的取值范围是 1–65533。[预览] 在 StarRocks 2.1 及更高版本中,length的取值范围是 1–1048576。 -
HLL (1~16385 字节):对于 HLL 类型,无需指定长度或默认值。长度将根据数据聚合在系统内部控制。HLL 列只能通过hll_union_agg、Hll_cardinality、hll_hash 进行查询或使用。
-
BITMAP:Bitmap 类型不需要指定长度或默认值。它表示一组无符号的 bigint 数字。最大元素可达 2^64 - 1。
agg_type
聚合类型。如果未指定,则此列是键列。 如果指定,则此列是值列。支持的聚合类型如下:
SUM、MAX、MIN、REPLACEHLL_UNION(仅适用于HLL类型)BITMAP_UNION(仅适用于BITMAP)REPLACE_IF_NOT_NULL:这意味着只有当导入数据为非空值时才会被替换。如果导入数据为空值,StarRocks 将保留原始值。
- 导入聚合类型为 BITMAP_UNION 的列时,其原始数据类型必须是 TINYINT、SMALLINT、INT 和 BIGINT。
- 如果在建表时,REPLACE_IF_NOT_NULL 列指定了 NOT NULL,StarRocks 仍会将数据转换为 NULL,而不会向用户发送错误报告。这样,用户可以导入选定的列。
此聚合类型仅适用于 key_desc 类型为 AGGREGATE KEY 的聚合表。自 v3.1.9 起,REPLACE_IF_NOT_NULL 新增支持 BITMAP 类型的列。
NULL | NOT NULL
是否允许列为 NULL。默认情况下,对于使用 Duplicate Key、Aggregate 或 Unique Key 表的所有列,都指定 NULL。在使用 Primary Key 表的表中,默认情况下,值列指定为 NULL,而键列指定为 NOT NULL。如果原始数据中包含 NULL 值,请使用 \N 表示它们。StarRocks 在数据加载期间将 \N 视为 NULL。
DEFAULT
列的默认值。当您将数据加载到 StarRocks 中时,如果映射到该列的源字段为空,StarRocks 会自动在该列中填充默认值。您可以通过以下方式之一指定默认值:
-
DEFAULT current_timestamp:使用当前时间作为默认值。更多信息,请参见 current_timestamp()。
-
DEFAULT (
<expr>):使用给定表达式或函数返回的结果作为默认值。支持 以下表达式:- uuid() 和 uuid_numeric():生成唯一标识符。
- ARRAY 字面量表达式(例如,
[1, 2, 3]):适用于 ARRAY 类型列。 - MAP 表达式(例如,
map{key: value}):适用于 MAP 类型列。 - row() 函数(例如,
row(val1, val2)):适用于 STRUCT 类型列。
-
DEFAULT
<default_value>:使用列数据类型的给定值作为默认值。StarRocks 支持为不同类型指定默认值:基本类型:使用字符串字面量指定默认值。
-- 数值类型
age INT DEFAULT '18'
price DECIMAL(10,2) DEFAULT '99.99'
-- 字符串类型
name VARCHAR(50) DEFAULT 'Anonymous'
-- 日期/时间类型
created_at DATETIME DEFAULT '2024-01-01 00:00:00'
-- 布尔类型
is_active BOOLEAN DEFAULT 'true' -- Supports 'true'/'false'/'1'/'0'JSON 类型:使用 JSON 格式的字符串指定默认值。
metadata JSON DEFAULT '{"status": "active"}'
tags JSON DEFAULT '[1, 2, 3]'VARBINARY 类型:仅支持空字符串作为默认值。
binary_data VARBINARY DEFAULT ''BITMAP 和 HLL 类型:仅支持空字符串作为默认值,仅适用于 AGGREGATE KEY 表。
-- 在 AGGREGATE KEY 表中
bm BITMAP BITMAP_UNION DEFAULT ''
h HLL HLL_UNION DEFAULT ''复杂类型 (ARRAY/MAP/STRUCT):使用表达式语法指定默认值,仅支持 OLAP 表。
备注
复杂类型的默认值是 仅在 fast_schema_evolution = true 时支持。如果表的 fast_schema_evolution 属性被明确设置为 false,则为复杂类型添加默认值将导致错误。
:::
-- ARRAY 类型
tags ARRAY<VARCHAR(20)> DEFAULT ['tag1', 'tag2']
scores ARRAY<INT> DEFAULT [90, 85, 92]
-- MAP 类型
attrs MAP<VARCHAR(20), INT> DEFAULT map{'age': 25, 'score': 100}
-- STRUCT 类型
person STRUCT<name VARCHAR(20), age INT> DEFAULT row('John', 30)
-- 复杂嵌套:包含嵌套 STRUCT、ARRAY 和 MAP 的 STRUCT
user_profile STRUCT<
id INT,
name VARCHAR(50),
contact STRUCT<email VARCHAR(100), phone VARCHAR(20)>,
tags ARRAY<VARCHAR(20)>,
attributes MAP<VARCHAR(20), VARCHAR(50)>
> DEFAULT row(1, 'Alice', row('alice@example.com', '123-456-7890'), ['admin', 'user'], map{'level': 'premium', 'status': 'active'})
限制:
- TIME 和 VARIANT 类型暂不支持默认值。
- 复杂类型(ARRAY/MAP/STRUCT)的默认值仅支持 OLAP 表,并且需要启用
fast_schema_evolution属性。
AUTO_INCREMENT
指定 AUTO_INCREMENT 列。AUTO_INCREMENT 列的数据类型必须是 BIGINT。自增 ID 从 1 开始,步长为 1。有关 AUTO_INCREMENT 列的更多信息,请参阅 自动递增。自 v3.0 起,StarRocks 支持 AUTO_INCREMENT 列。
AS
指定生成列及其表达式。生成列 可用于预计算和存储表达式结果,这显著加速了包含相同复杂表达式的查询。自 v3.1 起,StarRocks 支持生成列。
索引定义
INDEX index_name (col_name[, col_name, ...]) [USING BITMAP] COMMENT 'xxxxxx'
有关参数说明和使用注意事项的更多信息,请参阅 Bitmap 索引。
ENGINE
默认值:olap。如果未指定此参数,则默认创建 OLAP 表(StarRocks 原生表)。
可选值:mysql、elasticsearch、hive、jdbc、iceberg 和 hudi。
键
语法:
key_type(k1[,k2 ...])
数据在指定的键列中排序,并针对不同的键类型具有不同的属性:
-
AGGREGATE KEY:键列中相同的内容将根据指定的聚合类型聚合到值列中。它通常适用于财务报表和多维分析等业务场景。
-
UNIQUE KEY/PRIMARY KEY:键列中相同的内容将根据导入顺序在值列中被替换。它可用于对键列进行增、删、改、查操作。
-
DUPLICATE KEY:键列中相同的内容在 StarRocks 中共存。它可用于存储明细数据或没有聚合属性的数据。
备注
DUPLICATE KEY 是默认类型。数据将根据键列进行排序。 :::
除 AGGREGATE KEY 外,当使用其他键类型创建表时,值列无需指定聚合类型。
基于范围的分布
从 v4.1 起,StarRocks 支持 基于范围的分布语义(默认禁用),由 FE 配置 enable_range_distribution 控制。数据将根据键列的数据范围进行排序,每个 Tablet 包含来自特定范围的数据。
基于范围的分布语义与默认语义在以下方面有所不同:
- 如果显式指定了键类型(AGGREGATE KEY/UNIQUE KEY/PRIMARY KEY/DUPLICATE KEY),但未指定 DISTRIBUTED BY 子句,则数据将默认按范围分布。
- 如果未指定键类型、DISTRIBUTED BY 子句或 ORDER BY 子句,则将创建一个采用随机分桶策略的 Duplicate Key 表。
- 如果未指定键类型和 DISTRIBUTED BY 子句,但指定了 ORDER BY 子句,则将创建一个采用基于范围的分布策略的 Duplicate Key 表。在这种情况下,DUPLICATE KEY 等同于 ORDER BY 子句,反之亦然。
- 如果同时指定了 DUPLICATE KEY 和 ORDER BY 子句,则只有 ORDER BY 子句生效,DUPLICATE KEY 将被忽略。
COMMENT
您可以在创建表时添加表注释,可选。请注意,COMMENT 必须放在 key_desc 之后。否则,无法创建表。
从 v3.1 起,您可以使用 ALTER TABLE <table_name> COMMENT = "new table comment" 修改表注释。
分区
分区可以通过以下方式进行管理:
动态创建分区
动态分区 提供分区的生命周期 (TTL) 管理。StarRocks 会提前自动创建新分区并删除过期分区,以确保数据新鲜度。要启用此功能,您可以在创建表时配置动态分区相关属性。
逐个创建分区
仅指定分区的上限
语法:
PARTITION BY RANGE ( <partitioning_column1> [, <partitioning_column2>, ... ] )
PARTITION <partition1_name> VALUES LESS THAN ("<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] )
[ ,
PARTITION <partition2_name> VALUES LESS THAN ("<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] )
, ... ]
)
请使用指定的键列和指定的值范围进行分区。
-
有关分区的命名约定,请参阅系统限制。
-
在 v3.3.0 之前,范围分区列仅支持以下类型:TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE 和 DATETIME。从 v3.3.0 开始,三个特定的时间函数可以用作范围分区列。有关详细用法,请参阅数据分布。
-
分区是左闭 右开的。第一个分区的左边界是最小值。
-
NULL 值仅存储在包含最小值的分区中。当包含最小值的分区被删除时,NULL 值将无法再导入。
-
分区列可以是单列或多列。分区值是默认的最小值。
-
当只指定一列作为分区列时,您可以将
MAXVALUE设置为最新分区中分区列的上限。PARTITION BY RANGE (pay_dt) (
PARTITION p1 VALUES LESS THAN ("20210102"),
PARTITION p2 VALUES LESS THAN ("20210103"),
PARTITION p3 VALUES LESS THAN MAXVALUE
)
- 分区通常用于管理与时间相关的数据。
- 当需要数据回溯时,您可以考虑清空第一个分区,以便在以后需要时添加分区。
为分区指定下限和上限
语法:
PARTITION BY RANGE ( <partitioning_column1> [, <partitioning_column2>, ... ] )
(
PARTITION <partition_name1> VALUES [( "<lower_bound_for_partitioning_column1>" [ , "<lower_bound_for_partitioning_column2>", ... ] ), ( "<upper_bound_for_partitioning_column1?" [ , "<upper_bound_for_partitioning_column2>", ... ] ) )
[,
PARTITION <partition_name2> VALUES [( "<lower_bound_for_partitioning_column1>" [ , "<lower_bound_for_partitioning_column2>", ... ] ), ( "<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] ) )
, ...]
)
- Fixed Range 比 LESS THAN 更灵活。您可以自定义左右分区。
- Fixed Range 在其他方面与 LESS THAN 相同。
- 当只指定一列作为分区列时,您可以将
MAXVALUE设置为最新分区中分区列的上限。
PARTITION BY RANGE (pay_dt) (
PARTITION p202101 VALUES [("20210101"), ("20210201")),
PARTITION p202102 VALUES [("20210201"), ("20210301")),
PARTITION p202103 VALUES [("20210301"), (MAXVALUE))
)
批量创建多个分区
语法
-
如果分区列是日期类型。
PARTITION BY RANGE (<partitioning_column>) (
START ("<start_date>") END ("<end_date>") EVERY (INTERVAL <N> <time_unit>)
) -
如果分区列是整数类型。
PARTITION BY RANGE (<partitioning_column>) (
START ("<start_integer>") END ("<end_integer>") EVERY (<partitioning_granularity>)
)
说明
您可以在 START() 和 END() 中指定起始值和结束值,并在 EVERY() 中指定时间单位或分区粒度,以批量创建多个分区。
- 在 v3.3.0 之前,范围分区列仅支持以下类型:TINYINT、SMALLINT、INT、BIGINT、LARGEINT、DATE 和 DATETIME。从 v3.3.0 开始,三个特定的时间函数可以用作范围分区列。有关详细用法,请参阅数据分布。
- 如果分区列是日期类型,您需要使用
INTERVAL关键字来指定时间间隔。您可以将时间单位指定为小时(自 v3.0 起)、天、周、月或年。分区的命名约定与动态分区相同。
更多信息,请参阅数据分布。
分布
StarRocks 支持 Hash 分桶和随机分桶。如果您不配置分桶,StarRocks 默认使 用随机分桶并自动设置分桶数量。
-
随机分桶(自 v3.1 起)
对于分区中的数据,StarRocks 会将数据随机分布到所有分桶中,这不基于特定的列值。如果您希望 StarRocks 自动设置分桶数量,则无需指定任何分桶配置。如果您选择手动指定分桶数量,语法如下:
DISTRIBUTED BY RANDOM BUCKETS <num>但是,请注意,当您查询大量数据并频繁使用某些列作为条件列时,随机分桶提供的查询性能可能不理想。在这种情况下,建议使用 Hash 分桶。因为只需要扫描和计算少量分桶,从而显著提高查询性能。
注意事项