跳转至

3.5.2 明细模型

在某些多维分析场景下,必须保留所有原始数据记录,针对这种需求,可以使用明细数据模型。在明细数据模型中,存储层会保留写入的所有数据。即使两行数据完全相同,也都会保留。建表语句中指定的 Duplicate Key ,只是用来指明数据存储按照哪些列进行排序,可以用于优化常用查询。在 Duplicate Key 的选择上,建议选择前 2-4 列即可。

举例如下,一个表有如下的数据列,需要保留所有原始数据记录,有两种方法可以创建明细模型的表,分别为:指定排序列以及默认为明细模型。

ColumnName Type Comment
timestamp DATETIME 日志时间
type INT 日志类型
error_code INT 错误码
error_msg VARCHAR(128) 错误详细信息
op_id BIGINT 负责人 ID
op_time DATETIME 处理时间

1 指定排序列的明细模型

在建表语句中指定 Duplicate Key ,用来指明数据存储按照这些 Key 列进行排序。在 Duplicate Key 的选择上,建议选择前 2-4 列即可。

建表语句举例如下,指定了按照 timestamptypeerror_code 三列进行排序。

SQL
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE TABLE IF NOT EXISTS example_tbl_duplicate
(
    `timestamp` DATETIME NOT NULL COMMENT "日志时间",
    `type` INT NOT NULL COMMENT "日志类型",
    `error_code` INT COMMENT "错误码",
    `error_msg` VARCHAR(1024) COMMENT "错误详细信息",
    `op_id` BIGINT COMMENT "负责人id",
    `op_time` DATETIME COMMENT "处理时间"
)
DUPLICATE KEY(`timestamp`, `type`, `error_code`)
DISTRIBUTED BY HASH(`type`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);

MySQL> desc example_tbl_duplicate; 
+------------+---------------+------+-------+---------+-------+
| Field      | Type          | Null | Key   | Default | Extra |
+------------+---------------+------+-------+---------+-------+
| timestamp  | datetime      | No   | true  | NULL    |       |
| type       | int           | No   | true  | NULL    |       |
| error_code | int           | Yes  | true  | NULL    |       |
| error_msg  | varchar(1024) | Yes  | false | NULL    | NONE  |
| op_id      | bigint        | Yes  | false | NULL    | NONE  |
| op_time    | datetime      | Yes  | false | NULL    | NONE  |
+------------+---------------+------+-------+---------+-------+

2 默认为明细模型

当创建表的时候没有指定 UniqueAggregateDuplicate 时,会默认创建一个 Duplicate 模型的表,并自动按照一定规则选定排序列。建表语句举例如下,没有指定任何数据模型,则建立的是明细模型( Duplicate ),排序列系统自动选定了前 3 列。

SQL
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE TABLE IF NOT EXISTS example_tbl_by_default
(
    `timestamp` DATETIME NOT NULL COMMENT "日志时间",
    `type` INT NOT NULL COMMENT "日志类型",
    `error_code` INT COMMENT "错误码",
    `error_msg` VARCHAR(1024) COMMENT "错误详细信息",
    `op_id` BIGINT COMMENT "负责人id",
    `op_time` DATETIME COMMENT "处理时间"
)
DISTRIBUTED BY HASH(`type`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);

MySQL> desc example_tbl_by_default; 
+------------+---------------+------+-------+---------+-------+
| Field      | Type          | Null | Key   | Default | Extra |
+------------+---------------+------+-------+---------+-------+
| timestamp  | datetime      | No   | true  | NULL    |       |
| type       | int           | No   | true  | NULL    |       |
| error_code | int           | Yes  | true  | NULL    |       |
| error_msg  | varchar(1024) | Yes  | false | NULL    | NONE  |
| op_id      | bigint        | Yes  | false | NULL    | NONE  |
| op_time    | datetime      | Yes  | false | NULL    | NONE  |
+------------+---------------+------+-------+---------+-------+