Doris的一些进阶用法

本文详细介绍了Doris的进阶用法,包括如何修改表名、变更表结构,如增加、删除和修改列,以及管理分区。在表结构变更中,重点讨论了Schema Change的原理、作业创建、查看和取消。对于分区管理,内容涵盖了增加、删除和修改分区的规则。此外,还讲解了动态分区和临时分区的概念、操作以及它们在数据导入和查询中的应用。最后,探讨了Doris中的多种JOIN优化策略,如Shuffle Join、Broadcast Join、Bucket Shuffle Join和Colocation Join,以及Runtime Filter的使用,以提升查询效率。
摘要由CSDN通过智能技术生成

6.doris进阶

6.1修改表

6.1.1修改表名

示例:

  1. 将名为 table1 的表修改为 table2

SQL
ALTER TABLE table1 RENAME table2;

--
示例
ALTER TABLE aggregate_test RENAME aggregate_test1;

  1. 将表 example_table 中名为 rollup1 的 rollup index 修改为 rollup2

SQL
ALTER TABLE base_table_name RENAME ROLLUP old_rollup_name new_rollup_name;

mysql> desc ex_user all;
+-----------------+---------------+-----------------+-------------+------+-------+---------------------+---------+---------+
| IndexName       | IndexKeysType | Field           | Type        | Null | Key   | Default             | Extra   | Visible |
+-----------------+---------------+-----------------+-------------+------+-------+---------------------+---------+---------+
| ex_user         | AGG_KEYS      | user_id         | LARGEINT    | No   | true  | NULL                |         | true    |
|                 |               | date            | DATE        | No   | true  | NULL                |         | true    |
|                 |               | city            | VARCHAR(20) | Yes  | true  | NULL                |         | true    |
|                 |               | age             | SMALLINT    | Yes  | true  | NULL                |         | true    |
|                 |               | sex             | TINYINT     | Yes  | true  | NULL                |         | true    |
|                 |               | last_visit_date | DATETIME    | Yes  | false | 1970-01-01 00:00:00 | REPLACE | true    |
|                 |               | cost            | BIGINT      | Yes  | false | 0                   | SUM     | true    |
|                 |               | max_dwell_time  | INT         | Yes  | false | 0                   | MAX     | true    |
|                 |               | min_dwell_time  | INT         | Yes  | false | 99999               | MIN     | true    |
|                 |               |                 |             |      |       |                     |         |         |
| rollup_ucd_cost | AGG_KEYS      | user_id         | LARGEINT    | No   | true  | NULL                |         | true    |
|                 |               | city            | VARCHAR(20) | Yes  | true  | NULL                |         | true    |
|                 |               | date            | DATE        | No   | true  | NULL                |         | true    |
|                 |               | cost            | BIGINT      | Yes  | false | 0                   | SUM     | true    |
|                 |               |                 |             |      |       |                     |         |         |
| rollup_u_cost   | AGG_KEYS      | user_id         | LARGEINT    | No   | true  | NULL                |         | true    |
|                 |               | cost            | BIGINT      | Yes  | false | 0                   | SUM     | true    |
+-----------------+---------------+-----------------+-------------+------+-------+---------------------+---------+---------+


ALTER TABLE ex_user RENAME ROLLUP rollup_u_cost new_rollup_u_cost;

mysql> desc ex_user all;
+-------------------+---------------+-----------------+-------------+------+-------+---------------------+---------+---------+
| IndexName         | IndexKeysType | Field           | Type        | Null | Key   | Default             | Extra   | Visible |
+-------------------+---------------+-----------------+-------------+------+-------+---------------------+---------+---------+
| ex_user           | AGG_KEYS      | user_id         | LARGEINT    | No   | true  | NULL                |         | true    |
|                   |               | date            | DATE        | No   | true  | NULL                |         | true    |
|                   |               | city            | VARCHAR(20) | Yes  | true  | NULL                |         | true    |
|                   |               | age             | SMALLINT    | Yes  | true  | NULL                |         | true    |
|                   |               | sex             | TINYINT     | Yes  | true  | NULL                |         | true    |
|                   |               | last_visit_date | DATETIME    | Yes  | false | 1970-01-01 00:00:00 | REPLACE | true    |
|                   |               | cost            | BIGINT      | Yes  | false | 0                   | SUM     | true    |
|                   |               | max_dwell_time  | INT         | Yes  | false | 0                   | MAX     | true    |
|                   |               | min_dwell_time  | INT         | Yes  | false | 99999               | MIN     | true    |
|                   |               |                 |             |      |       |                     |         |         |
| rollup_ucd_cost   | AGG_KEYS      | user_id         | LARGEINT    | No   | true  | NULL                |         | true    |
|                   |               | city            | VARCHAR(20) | Yes  | true  | NULL                |         | true    |
|                   |               | date            | DATE        | No   | true  | NULL                |         | true    |
|                   |               | cost            | BIGINT      | Yes  | false | 0                   | SUM     | true    |
|                   |               |                 |             |      |       |                     |         |         |
| new_rollup_u_cost | AGG_KEYS      | user_id         | LARGEINT    | No   | true  | NULL                |         | true    |
|                   |               | cost            | BIGINT      | Yes  | false | 0                   | SUM     | true    |
+-------------------+---------------+-----------------+-------------+------+-------+---------------------+---------+---------+

  1. 将表 example_table 中名为 p1 的 partition 修改为 p2

SQL
ALTER TABLE example_table RENAME PARTITION old_partition_name new_partition_name ;

--
示例:
ALTER TABLE expamle_range_tbl RENAME PARTITION p201701 newp201701;

mysql> show partitions from expamle_range_tbl \G;
*************************** 1. row ***************************
             PartitionId: 11738
           PartitionName: newp201701
          VisibleVersion: 1
      VisibleVersionTime: 2023-01-03 16:06:05
                   State: NORMAL
            PartitionKey: date
                   Range: [types: [DATE]; keys: [0000-01-01]; ..types: [DATE]; keys: [2017-02-01]; )
         DistributionKey: user_id
                 Buckets: 1
          ReplicationNum: 3
           StorageMedium: HDD
            CooldownTime: 9999-12-31 23:59:59
LastConsistencyCheckTime: NULL
                DataSize: 0.000
              IsInMemory: false
       ReplicaAllocation: tag.location.default: 3

6.1.2表结构的变更

用户可以通过 Schema Change 操作来修改已存在表的 Schema。目前 Doris 支持以下几种修改:

  • 增加、删除列
  • 修改列类型
  • 调整列顺序
  • 增加、修改 Bloom Filter index
  • 增加、删除 bitmap index

6.1.2.1原理介绍

执行 Schema Change 的基本过程,是通过原 Index 的数据,生成一份新 Schema 的 Index 的数据。其中主要需要进行两部分数据转换:

一是已存在的历史数据的转换;

二是在 Schema Change 执行过程中,新到达的导入数据的转换。

SQL
+----------+
| Load Job |
+----+-----+
     |
     | Load job generates both origin and new index data
     |
     |      +------------------+ +---------------+
     |      | Origin Index     | | Origin Index  |
     +------> New Incoming Data| | History Data  |
     |      +------------------+ +------+--------+
     |                                  |
     |                                  | Convert history data
     |                                  |
     |      +------------------+ +------v--------+
     |      | New Index        | | New Index     |
     +------> New Incoming Data| | History Data  |
            +------------------+ +---------------+

6.1.2.2创建作业

Schema Change 的创建是一个异步过程,作业提交成功后,用户需要通过 SHOW ALTER TABLE COLUMN 命令来查看作业进度。

语法:

SQL
ALTER TABLE [database.]table alter_clause;

 schema change 的 alter_clause 支持如下几种修改方式:

  1. 向指定 index 的指定位置添加一列

SQL
ALTER TABLE db.table_name
--
如果增加的是key列 那么,需要在 列类型后面增加key 这个关键字
-- 如果增加的是value列 那么,是聚合表模型,需要指定列的聚合类型   如果是明细模型和唯一模型,不需要指定
ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]  -- 确定列的位置   如果不写,默认插在最后
[TO rollup_index_name]   -- 如果你是针对rollup表新增一个列,那么这个列明基表中不能有
[PROPERTIES ("key"="value", ...)]

-- 明细模型中添加value列
ALTER TABLE test.expamle_range_tbl ADD COLUMN abc varchar AFTER age;

-- 明细模型中添加key 列
ALTER TABLE test.expamle_range_tbl ADD COLUMN abckey varchar key AFTER user_id;

-- 聚合模型中添加一个value列
mysql> ALTER TABLE test.ex_user ADD COLUMN abckey int sum AFTER cost;

 注意:

  • 聚合模型如果增加 value 列,需要指定 agg_type
  • 非聚合模型(如 DUPLICATE KEY)如果增加key列,需要指定KEY关键字
  • 不能在 rollup index 中增加 base index 中已经存在的列(如有需要,可以重新创建一个 rollup index)

示例:

SQL
-- 源schema:

+-----------+-------+------+------+------+---------+-------+
| IndexName | Field | Type | Null | Key  | Default | Extra |
+-----------+-------+------+------+------+---------+-------+
| tbl1      | k1    | INT  | No   | true | N/A     |       |
|           | k2    | INT  | No   | true | N/A     |       |
|           | k3    | INT  | No   | true | N/A     |       |
|           |       |      |      |      |         |       |
| rollup2   | k2    | INT  | No   | true | N/A     |       |
|           |       |      |      |      |         |       |
| rollup1   | k1    | INT  | No   | true | N/A     |       |
|           | k2    | INT  | No   | true | N/A     |       |
+-----------+-------+------+------+------+---------+-------+

-- 源schema中没有k4和k5列,所以可以往rollup表中添加 k4和k5列,在往rollup表中添加的过程,也会往base表中添加一份
ALTER TABLE tbl1
ADD COLUMN k4 INT default "1" to rollup1,
ADD COLUMN k4 INT default "1" to rollup2,
ADD COLUMN k5 INT default "1" to rollup2;

-- 改变完成后,Schema 变为       base表中也会相应的添加k4和k5
+-----------+-------+------+------+------+---------+-------+
| IndexName | Field | Type | Null | Key  | Default | Extra |
+-----------+-------+------+------+------+---------+-------+
| tbl1      | k1    | INT  | No   | true | N/A     |       |
|           | k2    | INT  | No   | true | N/A     |       |
|           | k3    | INT  | No   | true | N/A     |       |
|           | k4    | INT  | No   | true | 1       |       |
|           | k5    | INT  | No   | true | 1       |       |
|           |       |      |      |      |         |       |
| rollup2   | k2    | INT  | No   | true | N/A     |       |
|           | k4    | INT  | No   | true | 1       |       |
|           | k5    | INT  | No   | true | 1       |       |
|           |       |      |      |      |         |       |
| rollup1   | k1    | INT  | No   | true | N/A     |       |
|           | k2    | INT  | No   | true | N/A     |       |
|           | k4    | INT  | No   | true | 1       |       |
+-----------+-------+------+------+------+---------+-------+

-- 这样的导入方式错误
-- 因为base表中已经存在k3,导入的时候无法将base表中在添加一个叫k3的列,重复
ALTER TABLE tbl1
ADD COLUMN k3 INT default "1" to rollup1

  1.  向指定 index 添加多列

SQL
ALTER TABLE db.table_name
ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]

--
添加的时候根据key和value列,添加在对应的列之后
ALTER TABLE test.expamle_range_tbl ADD COLUMN (abc int,bcd int);

mysql> ALTER TABLE test.expamle_range_tbl ADD COLUMN (a int key ,b int);
Query OK, 0 rows affected (0.01 sec)

mysql> desc expamle_range_tbl all;
+-------------------+---------------+-----------+-------------+------+-------+---------+-------+---------+
| IndexName         | IndexKeysType | Field     | Type        | Null | Key   | Default | Extra | Visible |
+-------------------+---------------+-----------+-------------+------+-------+---------+-------+---------+
| expamle_range_tbl | DUP_KEYS      | user_id   | LARGEINT    | No   | true  | NULL    |       | true    |
|                   |               | abckey    | VARCHAR(1)  | Yes  | true  | NULL    |       | true    |
|                   |               | date      | DATE        | No   | true  | NULL    |       | true    |
|                   |               | a         | INT         | Yes  | true  | NULL    |       | true    |
|                   |               | timestamp | DATETIME    | No   | false | NULL    | NONE  | true    |
|                   |               | city      | VARCHAR(20) | Yes  | false | NULL    | NONE  | true    |
|                   |               | age       | SMALLINT    | Yes  | false | NULL    | NONE  | true    |
|                   |               | sex       | TINYINT     | Yes  | false | NULL    | NONE  | true    |
|                   |               | abc       | INT         | Yes  | false | NULL    | NONE  | true    |
|                   |               | bcd       | INT         | Yes  | false | NULL    | NONE  | true    |
|                   |               | b         | INT         | Yes  | false | NULL    | NONE  | true    |
+-------------------+---------------+-----------+-------------+------+-------+---------+-------+---------+

  1.  从指定 index 中删除一列

SQL
ALTER TABLE db.table_name
DROP COLUMN column_name
[FROM rollup_index_name]

--
删除明细表中的value列
ALTER TABLE test.expamle_range_tbl DROP COLUMN abc;

-- 删除明细表中的key列
ALTER TABLE test.expamle_range_tbl DROP COLUMN abckey;

-- 删除聚合模型中的value列
ALTER TABLE test.ex_user DROP COLUMN abckey;

注意:

  • 不能删除分区列
  • 如果是从 base index 中删除列,则如果 rollup
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值