Doris-(六)-1.0 新特性

1、1.0 新特性

Doris 1.0 开始官网提供了编译好的二进制包,可以直接下载使用。如果老版本想滚动升
级新版本,可以参照官方说明:https://doris.apache.org/zh-CN/installing/upgrade.html
版本通告:https://mp.weixin.qq.com/s/Ju3K67jOrBdJ8BX-V1IIgw

1.1 向量化执行引擎

过去 Apache Doris 的 SQL 执行引擎是基于行式内存格式以及基于传统的火山模型进行设计的,在进行 SQL 算子与函数运算时存在非必要的开销,导致 Apache Doris 执行引擎的效率受限,并不适应现代 CPU 的体系结构。向量化执行引擎的目标是替换 Apache Doris 当前的行式 SQL 执行引擎,充分释放现代 CPU 的计算能力,突破在 SQL 执行引擎上的性能限制,发挥出极致的性能表现。

基于现代 CPU 的特点与火山模型的执行特点,向量化执行引擎重新设计了在列式存储系统的 SQL 执行引擎:
⚫ 重新组织内存的数据结构,用 Column 替换 Tuple,提高了计算时 Cache 亲和度,分支预测与预取内存的友好度
⚫ 分批进行类型判断,在本次批次中都使用类型判断时确定的类型,将每一行类型判断的虚函数开销分摊到批量级别。
⚫ 通过批级别的类型判断,消除了虚函数的调用,让编译器有函数内联以及 SIMD 优化的机会从而大大提高了 CPU 在 SQL 执行时的效率,提升了 SQL 查询的性能。
https://blog.csdn.net/qq_35423190/article/details/123129172
https://zhuanlan.zhihu.com/p/344706733

1.1.1 使用方式

set enable_vectorized_engine = true;
set batch_size = 4096;

batch_size 代表了 SQL 算子每次进行批量计算的行数。Doris 默认的配置为 1024,这个配
置的行数会影响向量化执行引擎的性能与 CPU 缓存预取的行为。官方推荐配置为 4096。

1.1.2 准备测试表

CREATE TABLE IF NOT EXISTS test_db.user
(
 `user_id` LARGEINT NOT NULL COMMENT "用户 id",
 `username` VARCHAR(50) NOT NULL COMMENT "用户昵称",
 `city` VARCHAR(20) NOT NULL COMMENT "用户所在城市",
 `age` SMALLINT NOT NULL COMMENT "用户年龄",
 `sex` TINYINT NOT NULL COMMENT "用户性别",
 `phone` LARGEINT NOT NULL COMMENT "用户电话",
 `address` VARCHAR(500) NOT NULL COMMENT "用户地址",
 `register_time` DATETIME NOT NULL COMMENT "用户注册时间"
)
UNIQUE KEY(`user_id`, `username`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 10
PROPERTIES("replication_num" = "1");
insert into test_db.user values\
(10000,'wuyanzu',' 北 京 ',18,0,12345678910,' 北 京 朝 阳 区 ','2017-10-01 
07:00:00'),\
(20000,'wuyanzu',' 北 京 ',19,0,12345678910,' 北 京 朝 阳 区 ','2017-10-01 
07:00:00'),\
(30000,'zhangsan','北京',20,0,12345678910,'北京海淀区','2017-11-15 
06:10:20');

1.1.3 查看效果

explain select name from user where user_id > 20000

开启了向量化执行引擎之后,在 SQL 的执行计划之中会在 SQL 算子前添加一个 V 的
标识。

1.1.4 注意事项

1)NULL 值
由于 NULL 值在向量化执行引擎中会导致性能劣化。所以在建表时,将对应的列设置
为 NULL 通常会影响向量化执行引擎的性能。这里推荐使用一些特殊的列值表示 NULL 值,
并在建表时设置列为 NOT NULL 以充分发挥向量化执行引擎的性能。
2)与行存执行引擎的部分差异
在绝大多数场景之中,用户只需要默认打开 session 变量的开关,就可以透明地使用向
量化执行引擎,并且使 SQL 执行的性能得到提升。但是,目前的向量化执行引擎在下面一
些微小的细节上与原先的行存执行引擎存在不同,需要使用者知晓。这部分区别分为两类
(1)a 类 :行存执行引擎需要被废弃和不推荐使用或依赖的功能
⚫ Float 与 Double 类型计算可能产生精度误差,仅影响小数点后 5 位之后的数字。如
果对计算精度有特殊要求,请使用 Decimal 类型。
⚫ DateTime 类型不支持秒级别以下的计算或 format 等各种操作,向量化引擎会直接
丢弃秒级别以下毫秒的计算结果。同时也不支持 microseconds_add 等,对毫秒计算
的函数。
⚫ 有符号类型进行编码时,0 与-0 在 SQL 执行中被认为是相等的。这可能会影响
distinct,group by 等计算的结果。
⚫ bitmap/hll 类型在向量化执行引擎中:输入均为 NULL,则输出的结果为 NULL 而
不是 0。
(2)b 类: 短期没有在向量化执行引擎上得到支持,但后续会得到开发支持的功能
⚫ 不支持原有行存执行引擎的 UDF 与 UDAF。
⚫ string/text 类型最大长度支持为 1MB,而不是默认的 2GB。即当开启向量化引擎后,
将无法查询或导入大于 1MB 的字符串。但如果关闭向量化引擎,则依然可以正常
查询和导入。
⚫ 不支持 select … into outfile 的导出方式。
⚫ 不支持 external broker 外表。
10.2 Hive 外表
Hive External Table of Doris 提供了 Doris 直接访问 Hive 外部表的能力,外部表省去
了繁琐的数据导入工作,并借助 Doris 本身的 OLAP 的能力来解决 Hive 表的数据分析问
题:
⚫ 支持 Hive 数据源接入 Doris
⚫ 支持 Doris 与 Hive 数据源中的表联合查询,进行更加复杂的分析操作

1.2.1 基本语法

CREATE [EXTERNAL] TABLE table_name (
 col_name col_type [NULL | NOT NULL] [COMMENT "comment"]
) ENGINE=HIVE
[COMMENT "comment"]
PROPERTIES (
 'property_name'='property_value',
 ...
);

参数说明:
(1)外表列
⚫ 列名要与 Hive 表一一对应
⚫ 列的顺序需要与 Hive 表一致
⚫ 必须包含 Hive 表中的全部列
⚫ Hive 表分区列无需指定,与普通列一样定义即可。
(2)ENGINE 需要指定为 HIVE
(3)PROPERTIES 属性:
⚫ hive.metastore.uris:Hive Metastore 服务地址
⚫ database:挂载 Hive 对应的数据库名
⚫ table:挂载 Hive 对应的表名

1.2.2 类型匹配

支持的 Hive 列类型与 Doris 对应关系如下表:

Hive Doris 描述
BOOLEAN BOOLEAN
CHAR CHAR 当前仅支持 UTF8 编码
VARCHAR VARCHAR 当前仅支持 UTF8 编码
TINYINT TINYINT
SMALLINT SMALLINT
INT INT
BIGINT BIGINT
FLOAT FLOAT
DOUBLE DOUBLE
DECIMAL DECIMAL
DATE DATE
TIMESTAMP DATETIME Timestamp 转 成 Datetime会损失精度

注意:
⚫ Hive 表 Schema 变更不会自动同步,需要在 Doris 中重建 Hive 外表。
⚫ 当前 Hive 的存储格式仅支持 Text,Parquet 和 ORC 类型
⚫ 当前默认支持的 Hive 版本为 2.3.7、3.1.2,未在其他版本进行测试。后续后支持
更多版本。

1.2.3 使用示例

完成在 Doris 中建立 Hive 外表后,除了无法使用 Doris 中的数据模型(rollup、预聚合、
物化视图等)外,与普通的 Doris OLAP 表并无区别
1)Hive 中创建测试表:

CREATE TABLE `test11` (
 `k1` int NOT NULL COMMENT "",
 `k2` char(10) NOT NULL COMMENT "",
 `k3` timestamp NOT NULL COMMENT "",
 `k5` varchar(20) NOT NULL COMMENT "",
 `k6` double NOT NULL COMMENT ""
)
insert into test11 values (1,'a',unix_timestamp(),'haha',1.0);

2)Doris 中创建外表

扫描二维码关注公众号,回复: 14722974 查看本文章
CREATE TABLE `t_hive` (
 `k1` int NOT NULL COMMENT "",
 `k2` char(10) NOT NULL COMMENT "",
 `k3` datetime NOT NULL COMMENT "",
 `k5` varchar(20) NOT NULL COMMENT "",
 `k6` double NOT NULL COMMENT ""
) ENGINE=HIVE
COMMENT "HIVE"
PROPERTIES (
'hive.metastore.uris' = 'thrift://hadoop1:9083',
'database' = 'test',
'table' = 'test11'
);

3)查询外表

select * from t_hive;

1.3 Laterval view 语法

通 过 Lateral View 语 法 , 我 们 可 以 使 用 explod_bitmap 、 explode_split 、
explode_jaon_array 等 Table Function 表函数,将 bitmap、String 或 Json Array 由一列展
开成多行,以便后续可以对展开的数据进行进一步处理(如 Filter、Join 等)。
1)创建测试表:

CREATE TABLE test3 (k1 INT,k2 varchar(30)) 
DISTRIBUTED BY HASH (k1) BUCKETS 2 
PROPERTIES("replication_num" = "1");
INSERT INTO test3 VALUES (1,''), (2,null), (3,','), 
(4,'1'),(5,'1,2,3'),(6,'a,b,c');

2)设置参数开启

set enable_lateral_view=true;

3)explode_bitmap:展开一个 bitmap 类型

select k1, e1 from test3 lateral view 
explode_bitmap(bitmap_from_string("1")) tmp1 as e1 order by k1, e1;

4)explode_split:将一个字符串按指定的分隔符分割成多个子串

select k1, e1 from test3 lateral view explode_split(k2, ',') tmp1 
as e1 order by k1, e1;

5)explode_json_array:展开一个 json 数组

select k1, e1 from test3 lateral view 
explode_json_array_int('[1,2,3]') tmp1 as e1 order by k1, e1;
select k1, e1 from test3 lateral view 
explode_json_array_double('[1.0,2.0,3.0]') tmp1 as e1 order by k1, 
e1;
select k1, e1 from test3 lateral view 
explode_json_array_string('[1,"b",3]') tmp1 as e1 order by k1, e1;

1.4 mysqldump 导出

Doris 1.0 支持通过 mysqldump 工具导出数据或者表结构,下面几种操作:
1)导出 test 数据库中的 user 表:

mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases 
test_db --tables user > dump1.sql

2)导出 test_db 数据库中的 user 表结构:

mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases 
test_db --tables user --no-data > dump2.sql

3)导出 test_db 数据库中所有表:

mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases 
test_db

4)导出所有数据库和表

mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --all-databases 

5)导出的结果可以重定向到文件中,之后可以通过 source 命令导入到 Doris 中

source /opt/module/doris-1.0.0/dump1.sql

猜你喜欢

转载自blog.csdn.net/qq_44696532/article/details/128464451