doris建表语句
时间: 2025-06-30 13:18:15 浏览: 11
<think>我们正在使用Doris数据库,用户想要了解如何编写建表语句,包括语法和示例。
根据引用[1],Doris数据库操作包括创建数据库和表的管理。引用[2]详细说明了Doris建表语法,特别是ENGINE类型olap是Doris负责数据管理和存储的,其他类型如mysql、broker等是外部表的映射。引用[4]则详细介绍了数据划分(分区和分桶)以及建表语法和示例。因此,我们需要提供Doris创建表的语法,并给出示例。注意,Doris建表语法中,数据划分(分区和分桶)是关键部分。Doris建表语法基本结构如下:```sqlCREATE[EXTERNAL]TABLE [IF NOTEXISTS][database.]table_name(column_definition1[,...]
)[ENGINE =[olap|mysql|broker|hive|...]]
[COMMENT "table comment"]
[PARTITIONBY RANGE(...) |PARTITION BYLIST(...)]--分区[DISTRIBUTED BYHASH(...)BUCKETS num]--分桶[PROPERTIES("key"="value", ...)]
```其中:- `column_definition`:列定义,包括列名、类型、聚合类型(如果需要)、默认值、注释等。
-`ENGINE`:表引擎,默认为olap。如果创建外部表,则使用其他引擎,如mysql、hive等。
-`PARTITION BY`:分区方式,有RANGE分区和LIST分区两种。- `DISTRIBUTED BY`:分桶,通过哈希分桶,指定分桶列和桶的数量。- `PROPERTIES`:设置表的属性,比如副本数、存储介质等。
示例1:创建一个olap表,使用RANGE分区和HASH分桶。
```sqlCREATE TABLEexample_db.example_table(event_dateDATE NOTNULL COMMENT"事件日期",site_id INTDEFAULT '10'COMMENT "站点ID",city_codeVARCHAR(100)COMMENT "城市编码",user_nameVARCHAR(32)REPLACE DEFAULT''COMMENT "用户名",pv BIGINT SUMDEFAULT '0'COMMENT "总访问量")
ENGINE=olapAGGREGATEKEY(event_date,site_id, city_code)--聚合模型,指定聚合keyCOMMENT "示例表"
PARTITION BYRANGE(event_date)--按日期范围分区(PARTITION p202201VALUES LESSTHAN("2022-02-01"),PARTITION p202202VALUES LESSTHAN("2022-03-01"),PARTITION p202203VALUES LESSTHAN("2022-04-01"))
DISTRIBUTEDBY HASH(site_id) BUCKETS10--按site_id分桶,10个桶PROPERTIES ("replication_num"= "3",--副本数"storage_medium"= "SSD"--存储介质);```
示例2:创建外部表(如MySQL表映射)
```sqlCREATE EXTERNALTABLE example_db.mysql_external_table(idINT,nameVARCHAR(20),age INT)ENGINE=mysqlCOMMENT "MySQL外部表"PROPERTIES("host" ="127.0.0.1","port" ="3306","user"= "mysql_user","password" ="mysql_passwd","database"= "example_db","table" ="example_table");
```示例3:使用LIST分区(按照城市编码分区)```sqlCREATETABLE example_db.sales_list(sale_date DATENOT NULLCOMMENT "销售日期",sale_idINT NOTNULL COMMENT"销售单ID",city_codeVARCHAR(20)NOTNULL COMMENT"城市编码",sale_amount DECIMAL(10,2)SUM COMMENT"销售总额")
ENGINE=olapAGGREGATEKEY(sale_date, sale_id,city_code)
COMMENT "销售表(LIST分区)"
PARTITION BYLIST(city_code)(PARTITIONp_city1VALUES IN("city1"),PARTITION p_city2 VALUESIN ("city2", "city3"),PARTITIONp_other VALUESIN ("other"))
DISTRIBUTEDBY HASH(sale_id) BUCKETS10PROPERTIES ("replication_num"= "3");
```注意:1.在Doris中,olap表支持多种数据模型:聚合模型(AGGREGATEKEY)、唯一模型(UNIQUE KEY)、重复模型(DUPLICATEKEY)。在示例1中我们使用了聚合模型,并指定了聚合key(非聚合列需要指定聚合函数,如SUM、REPLACE等)。
2.分区和分桶是Doris中数据划分的两个重要概念。分区用于将数据按照范围或列表进行划分,便于管理。分桶则是将数据按照哈希值分散到不同的桶中,以实现分布式存储和查询。
3.外部表的创建不需要分区和分桶,而是需要提供外部数据库的连接信息。
以上示例和语法应该可以帮助用户创建Doris表。接下来,根据用户要求生成相关问题。</think>### Doris 创建表的语法详解
Doris 建表语法核心结构如下:
```sql
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
(
column_definition1,
column_definition2,
...
)
[ENGINE = [olap|mysql|broker|hive]] -- 存储引擎类型
[COMMENT "table_description"]
[PARTITION BY {RANGE|LIST}(partition_column)] -- 分区策略
[DISTRIBUTED BY HASH(bucket_column) BUCKETS num] -- 分桶配置
[PROPERTIES ("key"="value")] -- 高级属性
```
#### 关键组件说明:
1. **列定义**
- 语法:`column_name data_type [AGGREGATE KEY] [DEFAULT default_value] [COMMENT "col_desc"]`
- 示例:`user_id INT COMMENT "用户ID", cost DECIMAL(10,2) SUM DEFAULT "0"`
2. **存储引擎 (ENGINE)**
- `olap`:Doris 原生存储(默认),支持高效分析[^2]
- `mysql`/`hive`:外部表映射(Doris 不存储实际数据)[^2]
3. **分区 (PARTITION BY)**
- **RANGE 分区**:按连续范围划分(如日期)
```sql
PARTITION BY RANGE(dt)
(
PARTITION p202301 VALUES [("2023-01-01"), ("2023-02-01")),
PARTITION p202302 VALUES [("2023-02-01"), ("2023-03-01"))
)
```
- **LIST 分区**:按离散值划分(如城市)
```sql
PARTITION BY LIST(city_code)
(
PARTITION p_beijing VALUES IN ("110000"),
PARTITION p_shanghai VALUES IN ("310000")
)
```
4. **分桶 (DISTRIBUTED BY)**
- 语法:`DISTRIBUTED BY HASH(user_id) BUCKETS 10`
- 作用:数据物理分片,影响查询并行度[^4]
5. **高级属性 (PROPERTIES)**
```sql
PROPERTIES (
"replication_num" = "3", -- 副本数
"storage_medium" = "SSD", -- 存储介质
"dynamic_partition.enable" = "true" -- 动态分区
)
```
---
### 完整示例
#### 示例1:OLAP 表(带分区分桶)
```sql
CREATE TABLE user_behavior
(
dt DATE NOT NULL COMMENT "日期",
user_id BIGINT COMMENT "用户ID",
item_id INT COMMENT "商品ID",
behavior_type VARCHAR(20) REPLACE COMMENT "行为类型",
click_count BIGINT SUM DEFAULT "0" COMMENT "点击次数"
)
ENGINE=olap
PARTITION BY RANGE(dt) -- 按日期分区
(
PARTITION p202301 VALUES [("2023-01-01"), ("2023-02-01")),
PARTITION p202302 VALUES [("2023-02-01"), ("2023-03-01"))
)
DISTRIBUTED BY HASH(user_id) BUCKETS 8 -- 按用户ID分桶
PROPERTIES (
"replication_num" = "3",
"storage_cooldown_time" = "2023-12-31 23:59:59"
);
```
#### 示例2:MySQL 外部表
```sql
CREATE EXTERNAL TABLE mysql_users
(
id INT,
name VARCHAR(50),
age TINYINT
)
ENGINE=mysql
PROPERTIES (
"host" = "127.0.0.1",
"port" = "3306",
"user" = "doris",
"password" = "password",
"database" = "test",
"table" = "users"
);
```
---
### 注意事项
1. **数据模型选择**
Doris OLAP 表支持三种模型:
- `AGGREGATE KEY`:聚合模型(适合指标表)
- `UNIQUE KEY`:唯一主键(适合维度表)
- `DUPLICATE KEY`:明细模型(全原始数据)
2. **分区与分桶建议**
- 分区字段常选**时间维度**,单分区数据量建议 1-10GB[^4]
- 分桶数量推荐 **10-100 个**,需避免数据倾斜
3. **MySQL 语法差异**
Doris 虽兼容部分 MySQL 语法,但聚合函数(如 `median()`)和行为有差异,需参考官方兼容性文档[^3]。
---
阅读全文
相关推荐
















