Doris建表注意事项

本文探讨了数据库中的关键概念,包括分组聚合模型中value列的聚合限制,以及Range和List分区的不同列类型支持。重点强调了在分桶模型中,如何确定Key列的选择规则,特别是在Aggregate、Unique和Duplicate模型中。

KEY

  1. 想要做key的字段必须是非空字段(NOT NULL)
  2. key字段必须从表的第一个字段开始选择,并且需要连续选择,不可跳跃选择
  3. eg: 表的字段为 a,b,c,d 四个字段,那么key只能选择a、ab、abc、abcd 四种

VALUE

  1. 分组聚合模型中,value列必须设置聚合方式
  2. 字符串类型无法进行sum

分区 KEY

  1. Range 分区支持的列类型:[DATE,DATETIME,TINYINT,SMALLINT,INT,BIGINT,LARGEINT]
  2. List 分区支持的列类型: [BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR]
  3. 分区列可以是多列但必须是KEY 列 

分桶KEY

  1. 分桶列可以是多列,Aggregate 和 Unique 模型必须为 Key 列,Duplicate 模型可以是 key 列和 value 列。分桶列可以和 Partition 列相同或不同。
<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]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值