Apache Doris 基础 -- 数据表设计(模式更改)
用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改,可以查看数据表设计/表索引,查看每个索引的更改方法。
1、术语
- 基本表(Base Table):创建每个表时,它对应于一个基表。
- Rollup:基于基表或其他上Rollup创建的上Rollup表。
- Index: 物化索引(materialized index)。汇总(Rollup )表或基表都称为物化索引。
- Transaction:每个导入任务都是一个事务,每个事务都有一个惟一的递增事务ID。
2、介绍
Light Schema Change
在介绍之前,有必要了解Apache Doris 1.2.0版本之前的三个Schema Change实现,它们都是异步的:
- 硬链接模式更改(
Hard Linked Schema Change
) 主要对值列进行加减操作,不需要修改数据文件。 - 直接模式更改(
Direct Schema Change
)主要用于更改值列的类型,需要重写数据,但不涉及键列,也不需要重新排序。 - 排序模式更改(
Sort schema change
)主要用于键列模式更改,因为键列加/减/修改类型等操作会影响现有数据的排序,所以需要将数据再次读出,修改,然后排序。
自Apache Doris 1.2.0以来,对于第一种类型,已经引入了轻量级模式更改(light schema change)的新特性。新的轻型模式更改允许在毫秒内完成值列的加减。从Apache Doris 2.0.0开始,默认情况下,所有新创建的表都支持轻模式更改。
除了添加和删除value列之外,其他类型的模式更改的主要原则如下:
执行模式更改的基本过程是从原始表/Index
数据中的数据/Index
生成新的模式表。数据转换主要有两部分,一部分是对已有历史数据的转换,另一部分是对执行模式更改时新导入的数据进行转换。
+----------+
| 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 |+------------------+ +---------------+
在开始转换历史数据之前,Doris将获取一个最新的事务ID,并等待该事务ID完成之前的所有导入事务。这个事务ID成为一个分水岭。这意味着Doris确保分水岭之后的所有导入任务将同时为原始表/索引和新表/索引生成数据。这样,当历史数据转换完成后,就可以保证新表中的数据是完整的。
创建模式更改的特定语法可以在帮助ALTER TABLE COLUMN的模式更改部分中找到。
3、将位于指定位置的列添加到指定索引
ALTER TABLE table_name ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 对于aggregate 模型,如果添加值列,则指定
agg_type
。 - 对于非聚合模型(例如,
DUPLICATE KEY
),如果添加键列,请指定KEY
关键字。 - 不能在 Rollup Index 中增加 Base Index 中已经存在的列(如有需要,可以重新创建一个 Rollup Index)。
Examples
- 在
example_rollup_index
的col1
之后添加一个键列new_col
(非聚合模型)
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT KEY DEFAULT "0" AFTER col1
TO example_rollup_index;
- 向
example_rollup_index
添加一个值列new_col(非聚合模型),它在col1之后的默认值为0
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT DEFAULT "0" AFTER col1
TO example_rollup_index;
- 在
example_rollup_index
的col1
之后添加一个键列new_col
(聚合模型)
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT DEFAULT "0" AFTER col1
TO example_rollup_index;
- 向
example_rollup_index
添加col1
之后具有SUM聚合类型(聚合模型)的值列new_col
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT SUM DEFAULT "0" AFTER col1
TO example_rollup_index;
4、向指定索引添加多个列
ALTER TABLE table_name ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 对于聚合模型,如果添加值列,则指定
agg_type
。 - 对于聚合模型,如果添加键列,请指定
KEY
关键字。(?) - 不能向基本索引中已经存在的rollup索引添加列(如果需要,可以创建新的rollup索引)。
Example
向example_rollup_index
添加多个列(聚合模型):
ALTER TABLE example_db.my_table
ADD COLUMN (col1 INT DEFAULT "1", col2 FLOAT SUM DEFAULT "2.3")
TO example_rollup_index;
5、从指定索引中删除列
ALTER TABLE table_name DROP COLUMN column_name
[FROM rollup_index_name]
- 不能删除分区列。
- 如果是从 Base Index 中删除列,则如果 Rollup Index 中包含该列,也会被删除
Example
从example_rollup_index
中删除col2
列:
ALTER TABLE example_db.my_table
DROP COLUMN col2
FROM example_rollup_index;
6、修改指定索引的列类型和位置
ALTER TABLE table_name MODIFY COLUMN column_name column_type [KEY | agg_type] [NULL | NOT NULL] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 对于聚合模型,如果修改值列,则指定
agg_type
。 - 对于非聚合模型,如果修改键列,请指定KEY 关键字。
- **只有列类型可以修改,其他列属性保持不变(**即,其他属性需要显式写入语句中,参见例8)。
- 不能修改分区列和桶列。
- 目前支持以下类型转换(用户需要保证精度损失):
- 从TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE转换为更大的数字类型。
- 从TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL到VARCHAR的转换。
- 修改VARCHAR的最大长度
- 从VARCHAR/CHAR转换为TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE。
- 从VARCHAR/CHAR到DATE的转换(支持六种格式:
"%Y-%m-%d", "%y-%m-%d", "%Y%m%d", "%y%m%d", "%Y/%m/%d", "%y/%m/%d"
) - 从DATETIME转换到DATE(仅保留年-月-日信息,例如:
2019-12-09 21:47:05 <--> 2019-12-09
) - 从DATE到DATETIME的转换(自动为小时、分钟和秒添加零,例如:
2019-12-09 <--> 2019-12-09 00:00:00
) - 从FLOAT到DOUBLE的转换
- 从INT到DATE的转换(如果INT类型数据无效,转换失败,原始数据保持不变)。
- 除了DATE和DATETIME以外的所有类型都可以转换为STRING,但是STRING不能转换为其他类型。
Examples
- 修改基索引中键列
col1
的列类型为BIGINT,并将其移动到列col2
之后
ALTER TABLE example_db.my_table
MODIFY COLUMN col1 BIGINT KEY DEFAULT "1" AFTER col2;
注意:无论是修改键列还是值列,都需要声明完整的列信息。
- 修改Base Index中列
val1
的最大长度。原来的val1
是(val1 VARCHAR(32) REPLACE DEFAULT "abc"
)
ALTER TABLE example_db.my_table
MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc"
注意:在保持列的其他属性不变的情况下,只能修改列的类型。
- 修改duplicate key 表的键列中字段的长度
alter table example_tbl modify column k3 varchar(50) key null comment 'to 50'
7、为指定索引重新排序列
ALTER TABLE table_name ORDER BY (column_name1, column_name2, ...)
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 应该列出索引中的所有列
- 值列在键列之后。
Example
重新排序索引example_rollup_index中的列(假设原始列顺序为:k1、k2、k3、v1、v2
)。
ALTER TABLE example_db.my_table
ORDER BY (k3,k1,k2,v2,v1)
FROM example_rollup_index;
8、在一次提交中执行多个更改
模式更改可以在单个作业中修改多个索引。
Example 1
可以使用以下命令将列k4添加到rollup1
和rollup2
,并将列k5添加到rollup2
:
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;
完成后,模式变为:
如所见,基表tbl1
自动包含列k4
和k5
。添加到rollup
中的任何列都将自动添加到基表中。
此外,不允许向rollup 中添加已经存在于基表中的列。如果用户需要这样做,他们可以使用附加列创建一个新的汇总,然后删除原始的汇总。
Example 2
ALTER TABLE example_db.my_table
ADD COLUMN v2 INT MAX DEFAULT "0" AFTER k2 TO example_rollup_index,
ORDER BY (k3,k1,k2,v2,v1) FROM example_rollup_index;
9、修改列名称
ALTER TABLE RENAME COLUMN old_column_name new_column_name;
10、检查作业状态
模式更改的创建是一个异步过程。作业提交成功后,用户需要使用SHOW ALTER TABLE COLUMN
命令查看作业的进度。
SHOW ALTER TABLE COLUMN
允许您查看当前正在执行或已完成的模式更改作业。当模式更改作业涉及多个索引时,该命令将显示多行,每行对应一个索引。例如:
mysql SHOW ALTER TABLE COLUMN\G;
*************************** 1. row ***************************JobId: 20021TableName: tbl1CreateTime: 2019-08-05 23:03:13FinishTime: 2019-08-05 23:03:42IndexName: tbl1IndexId: 20022
OriginIndexId: 20017
SchemaVersion: 2:792557838
TransactionId: 10023State: FINISHEDMsg: Progress: NULLTimeout: 86400
1 row in set (0.00 sec)
-
JobId:每个模式修改作业的唯一ID。
-
TableName:与模式更改相关联的基表的名称。
-
CreateTime:作业创建时间。
-
FinishTime:任务完成时间。如果未完成,则显示“N/A”。
-
IndexName:要修改的索引的名称。
-
IndexId:新索引的唯一ID。
-
OriginIndexId:旧索引的唯一ID。
-
SchemaVersion:以M:N的格式显示,其中M表示schema change 变更的版本,N表示对应的哈希值。版本随着每次模式更改而增加。
-
TransactionId: 转换历史数据的分水岭 Transaction ID。
-
State:当前工作的状态。
PENDING
:该作业正在等待调度队列中。WAITING_TXN
:等待边界事务ID完成前的导入任务。RUNNING
:正在进行历史数据转换。FINISHED
:工作成功完成。CANCELLED
:作业被取消。
-
Msg:如果任务失败,该字段显示失败消息。
-
Progress: 工作进展。只有状态为RUNNING时才会显示。进度以M/N的格式显示,其中N是模式更改中涉及的副本总数,M是完成历史数据转换的副本数量。
-
Timeout:作业超时(以秒为单位)。
11、取消作业
当任务状态不是FINISHED或CANCELLED时,可以使用以下命令取消模式修改任务:
CANCEL ALTER TABLE COLUMN FROM tbl_name;
说明
- 一次只能在一个表上运行一个模式更改作业。
- 模式更改操作不会阻塞导入和查询操作。
- 不能修改分区列和桶列。
- 如果模式包含使用
REPLACE
方法聚合的值列,则不允许删除键列。 - 如果键列被删除,Doris无法确定
REPLACE
列的值。 - Unique 数据模型表的所有非 Key 列都是 REPLACE 聚合方式。
- 在添加聚合类型为
SUM
或REPLACE
的值列时,该列的默认值对于历史数据没有任何意义。 - 由于历史数据丢失了详细信息,默认值不能反映实际的聚合值。
- 修改列类型时,除type外的所有字段都需要根据原列的信息填写。
- 例如,要将列k1从
INT SUM NULL DEFAULT "1"
修改为BIGINT
,命令如下:ALTER TABLE tbl1 MODIFY COLUMN k1 BIGINT SUM NULL DEFAULT "1"
; - 请注意,除了新的列类型之外,聚合方法、可空属性和默认值等其他属性都应该根据原始信息完成。
- 不支持修改聚合类型、可空属性、默认值或列注释。
FAQs
模式更改的执行速度
对于轻型模式更改(例如添加或删除Value列),执行速度可以在毫秒范围内。对于其他类型的Schema Change,在最坏的情况下,执行速度估计在10MB/s左右。作为保守的度量,用户可以根据这个速度设置作业超时。
错误:提交作业时提示“Table xxx is not stable
”
只有当表数据完成且处于平衡状态时,才能启动Schema Change。如果表的某些数据分片副本不完整,或者某些副本正在进行平衡操作,则提交将被拒绝。使用命令查看数据分片副本是否完成。
SHOW REPLICA STATUS FROM tbl WHERE STATUS != "OK";
如果返回任何结果,则表明副本存在问题。通常,系统将自动修复这些问题,但用户可以使用以下命令优先修复特定表:
ADMIN REPAIR TABLE tbl1;
使用实例查询是否有正在运行的均衡任务。
SHOW PROC "/cluster_balance/pending_tablets";
等待均衡任务完成或暂时停止均衡操作。
ADMIN SET FRONTEND CONFIG ("disable_balance" = "true");
配置
FE 配置
alter_table_timeout_second
:作业的默认超时时间,设置为86400秒。
BE 配置
alter_tablet_worker_count
:BE端用于执行历史数据转换的线程数。默认值是3。如果希望加速Schema Change作业,可以增大此参数并重新启动BE。然而,拥有太多的转换线程可能会增加IO压力并影响其他操作。该线程与Rollup作业共享。alter_index_worker_count
:BE端用于在历史数据上构建索引的线程数(目前只支持倒排索引)。默认值是3。如果要加速Index Change作业,可以增大此参数并重新启动BE。但是,线程太多可能会增加IO压力并影响其他操作。
更多细节
有关Schema Change的更详细语法和最佳实践,请参阅ALTER TABLE COLUMN命令手册。您也可以在MySQL客户端命令行中输入HELP ALTER TABLE COLUMN
获取更多帮助信息。
相关文章:

Apache Doris 基础 -- 数据表设计(模式更改)
用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改,可以查看数据表设计/表索引,查看每个索引的更改方法。 1、术语 基本表(Base Ta…...

【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】
仅供学习、参考使用 一、遗传算法简介 遗传算法(Genetic Algorithm, GA)是机器学习领域中常见的一类算法,其基本思想可以用下述流程图简要表示: (图参考论文:Optimization of Worker Scheduling at Logi…...

电子电气架构 ---车载安全防火墙
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
解决selenium加载网页过慢影响程序运行时间的问题
在用selenium爬取动态加载网页时,发现网页内容都全部加载完了,但是页面还在转圈,并且获取页面内容的代码也没有执行,后面了解到selenium元素操作等方法是需要等待页面所有元素完全加载完成后才开始执行的,所以在页面未…...

何为云防护?有何作用
云防护又称云防御。随着Internet互联网络带宽的增加和多种DDOS 黑客工具的不断发布,云计算越演越热,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素,导致很多IDC 托管…...

2024050402-重学 Java 设计模式《实战责任链模式》
重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」 一、前言 场地和场景的重要性 射击🏹需要去靶场学习、滑雪🏂需要去雪场体验、开车🚗需要能上路实践,而编程…...

centos7安装字体
1.安装命令 yum install fontconfig #字体库命令 yum install mkfontscale #更新字体命令2.安装字体(注意权限问题) 进入目录 /usr/share/fonts ,该目录是 centos7 字体库的默认安装目录。在该目录下创建一个文件夹 ekp (名字…...

Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集
LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...

学习Canvas过程中2D的方法、注释及感悟一(通俗易懂)
1.了解Canvas: Canvas是前端一个很重要的知识点,<canvas>标签用于创建画布绘制图形,通过JavaScript进行操作。它为开发者提供一个动态绘制图形的区域,用于创建图标、游戏动画、图像处理等。 对于能够熟练使用Canvas的开发者…...

《TCP/IP网络编程》(第十三章)多种I/O函数(2)
使用readv和writev函数可以提高数据通信的效率,它们的功能可以概括为**“对数据进行整合传输及发送”**。 即使用writev函数可以将分散在多个缓冲中的数据一并发送,使用readv函数可以由多个缓冲分别接受,所以适当使用他们可以减少I/O函数的调…...

Java集合汇总
Java中的集合框架是Java语言的核心部分,提供了强大的数据结构来存储和操作对象集合。集合框架位于java.util包中,主要可以分为两大类:Collection(单列集合)和Map(双列集合)。下面是对它们的总结…...

度小满金融大模型的应用创新
XuanYuan/README.md at main Duxiaoman-DI/XuanYuan GitHub...

Android WebView上传文件/自定义弹窗技术,附件的解决方案
安卓内核开发 其实是Android的webview默认是不支持<input type"file"/>文件上传的。现在的前端页面需要处理的是: 权限 文件路径AndroidManifest.xml <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…...
selenium 输入框、按钮,输入点击,获取元素属性等简单例子
元素操作 nput框 输入send_keys, input框 清除clear(), 按钮 点击click() 按钮 提交submit() 获取元素 tag_name、 class属性值、 坐标尺寸 """ input框 输入1次,再追加输入一次, 清除, 再重新输入&…...
结构体构造函数
【知识点:结构体构造函数】下面两段代码等价。 (1)结构体构造函数写法 struct LinkNode {int data;LinkNode* next;LinkNode(int x):data(x),next(NULL) {} }; LinkNode* Lnew LinkNode(123); (2)非结构体构造函数写…...
基于单片机的电子万年历设计
摘要: 本设计以 AT89C51 单片机为主控器,使用 DS1302 时钟芯片、DS18B20 温度芯片、LCD1602 显示模块,利用Proteus 仿真软件和 Keil 编译软件进行了基于单片机的电子万年历仿真,设计的万年历可以在液晶上显示时间,同时还具有时间校准、温度显示等功能。 关键词 :单片机…...

大厂真实面试题(一)
滴滴大数据sql 取出累计值与1000差值最小的记录 1.题目 已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 2.分析 本题主要是想找到累加值域1000差距最小的记录,也就是我们要对上述按照id进行排序并且累加,并…...

Docker搭建ELKF日志分析系统
Docker搭建ELKF日志分析系统 文章目录 Docker搭建ELKF日志分析系统资源列表基础环境一、系统环境准备1.1、创建所需的映射目录1.2、修改系统参数1.3、单击创建elk-kgc网络桥接 二、基于Dockerfile构建Elasticsearch镜像2.1、创建Elasticsearch工作目录2.2、上传资源到指定工作路…...

把系统引导做到U盘,实现插上U盘才能开机
前言 有个小伙伴提出了这样一个问题:能不能把U盘制作成电脑开机的钥匙? 小白稍微思考了一下,便做了这样一个回复:可以。 至于为什么要思考一下,这样会显得我有认真思考他提出的问题。 Windows7或以上系统均支持UEF…...

【计算机网络基础知识】
首先举一个生活化的例子,当你和朋友打电话时,你可能会使用三次握手和四次挥手的过程进行类比: 三次握手(Three-Way Handshake): 你打电话给朋友:你首先拨打你朋友的电话号码并等待他接听。这就…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...