建表語法
使用 CREATE TABLE 命令建立一個表(Table)。更多詳細參數可以查看:
HELP CREATE TABLE;
建表語法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name(column_definition1[, column_definition2, ...][, index_definition1[, index_definition12,]])[ENGINE = [olap|mysql|broker|hive]][key_desc][COMMENT "table comment"];[partition_desc][distribution_desc][rollup_index][PROPERTIES ("key"="value", ...)][BROKER PROPERTIES ("key"="value", ...)];
Doris 的建表是一個同步命令,命令返回成功,即表示建表成功。
Doris 支持支持單分區和復合分區兩種建表方式。
1)復合分區:既有分區也有分桶
第一級稱為 Partition,即分區。用戶可以指定某一維度列作為分區列(當前只支持整型和時間類型的列),并指定每個分區的取值范圍。
第二級稱為 Distribution,即分桶。用戶可以指定一個或多個維度列以及桶數對數據進行 HASH 分布。
2)單分區:只做 HASH 分布,即只分桶。
字段類型
注:聚合模型在定義字段類型后,可以指定字段的 agg_type 聚合類型,如果不指定,則該列為 key 列。否則,該列為 value 列, 類型包括:SUM、MAX、MIN、REPLACE。
我們以一個建表操作來說明 Doris 的數據劃分。
Range Partition
CREATE TABLE IF NOT EXISTS example_db.expamle_range_tbl
(`user_id` LARGEINT NOT NULL COMMENT "用戶 id",`date` DATE NOT NULL COMMENT "數據灌入日期時間",`timestamp` DATETIME NOT NULL COMMENT "數據灌入的時間戳",`city` VARCHAR(20) COMMENT "用戶所在城市",`age` SMALLINT COMMENT "用戶年齡",`sex` TINYINT COMMENT "用戶性別",`last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用戶最后一次訪問時間",`cost` BIGINT SUM DEFAULT "0" COMMENT "用戶總消費",`max_dwell_time` INT MAX DEFAULT "0" COMMENT "用戶最大停留時間",`min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用戶最小停留時間"
)
ENGINE=olap
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
PARTITION BY RANGE(`date`)
(PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),PARTITION `p201703` VALUES LESS THAN ("2017-04-01")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES
("replication_num" = "3","storage_medium" = "SSD","storage_cooldown_time" = "2018-01-01 12:00:00"
);
List Partition
CREATE TABLE IF NOT EXISTS example_db.expamle_list_tbl
(`user_id` LARGEINT NOT NULL COMMENT "用戶 id",`date` DATE NOT NULL COMMENT "數據灌入日期時間",`timestamp` DATETIME NOT NULL COMMENT "數據灌入的時間戳",`city` VARCHAR(20) COMMENT "用戶所在城市",`age` SMALLINT COMMENT "用戶年齡",`sex` TINYINT COMMENT "用戶性別",`last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用戶最后一次訪問時間",`cost` BIGINT SUM DEFAULT "0" COMMENT "用戶總消費",`max_dwell_time` INT MAX DEFAULT "0" COMMENT "用戶最大停留時間",`min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用戶最小停留時間"
)
ENGINE=olap
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
PARTITION BY LIST(`city`)
(PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),PARTITION `p_jp` VALUES IN ("Tokyo")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES
("replication_num" = "3","storage_medium" = "SSD","storage_cooldown_time" = "2018-01-01 12:00:00"
);
數據劃分
列定義
以 AGGREGATE KEY 數據模型為例進行說明。更多數據模型參閱 Doris 數據模型。
列的基本類型,可以通過在 mysql-client 中執行 HELP CREATE TABLE; 查看。
AGGREGATE KEY 數據模型中,所有沒有指定聚合方式(SUM、REPLACE、MAX、MIN)的列視為 Key 列。而其余則為 Value 列。
定義列時,可參照如下建議:
-
Key 列必須在所有 Value 列之前。
-
盡量選擇整型類型。因為整型類型的計算和查找比較效率遠高于字符串。
-
對于不同長度的整型類型的選擇原則,遵循夠用即可。
-
對于 VARCHAR 和 STRING 類型的長度,遵循 夠用即可。
-
所有列的總字節長度(包括 Key 和 Value)不能超過 100KB。
接下篇----------Doris分區與分桶