StarRocks 生成列:百倍提速半结构化数据分析

半结构化分析主要是指对 MAP,STRUCT,JSON,ARRAY 等复杂数据类型的查询分析。这些数据类型表达能力强,因此被广泛应用到 OLAP 分析的各种场景中,但由于其实现的复杂性,对这些复杂类型分析将会比一般简单类型要更困难和耗时,例如:

  • 需要对 MAP,STRUCT,JSON 等数据类型中的某个字段进行查询分析。由于这些复杂类型会被存储为一个整体,因此需要先将整个半结构化类型的字段先从存储层读取上来,然后再对其中的某些字段进行分析,IO效率较低。
  • 对复杂类型进行较为耗时的分析计算(聚合,排序等等),查询的实时CPU 开销可能也是一个不可忽略的性能影响因素。

面对上述的挑战,StarRocks在3.1 版本正式推出生成列(Generated Column)特性,提供一种透明加速的解决方案,能有效提升半结构化数据的分析效率,令用户拥有更极速的分析体验。

生成列介绍

生成列是一种特殊的列,可以在建表语句或 Schema Change 语句中指定,生成列绑定到一个标量表达式上,当数据导入时,会自动根据表达式定义进行计算,并且将其计算结果写入到生成列中。

alt

在半结构化分析的场景中,可以将复杂耗时的标量表达式绑定在某个生成列上,在数据导入阶段提前将结果计算好并且持久化到磁盘中。当需要进行查询分析时,即可马上获得表达式计算的结果。

生成列的查询改写

当希望查询生成列保存的表达式计算结果时,可以直接在 SQL 中指定生成列的列名,但是这种方法意味着需要调整已有业务 SQL,很难完全做到无缝对接。

为了进一步提升功能的使用体验,简化使用流程,StarRocks 支持生成列自动查询改写。在生成执行计划时,SQL 优化器将会检查 SQL 中所有的表达式,并且将那些已经绑定到生成列上的表达式,改写成查询生成列列值。

例如,上述例子中,如果在某个查询中需要获取 colc 中的 a 字段,则执行查询SELECT get_json_string(json_string(tbl.colc), '$.a') FROM tbl,执行过程大致如下:

alt

可见,优化器自动将表达式改写为查询生成列的值,实现透明加速。

高效的生成列加列

在实际应用生成列的使用场景中,在已有的表添加生成列可能是一个高频操作。例如,可能在任意时间点发现某个表达式计算存在性能瓶颈,因此希望添加生成列以进行查询加速。

StarRocks 支持高效的加列操作,对于添加普通列,存储引擎并不会真正重写物理文件,而只是将物理文件重新 link 到新 Tablet 的路径下,修改元数据,完成加列操作。但是,如 MODIFY COLUMN 这类 Schema Change 操作,由于需要改变存量数据的内容,因此会重写所有物理文件。类似地,对于生成列加列来说,由于需要存储新增的生成列表达式的计算结果,重写数据似乎也是不可避免的。但是,如果仍然采用全量重写物理文件的方案,将无法很好适应频繁加列的场景,加列的代价太大。

为了进一步提高生成列加列的效率,StarRocks 针对生成列加列进行了专门的优化。当添加一个生成列时,不会改写存量的物理文件,而是为每一个存量的 segment 生成一个只包含生成列值的 cols 文件(物理格式和 segment 文件一样,但只包含生成列一列数据),当需要查询这些存量数据时,StarRocks 会自动将 segment 和 cols 文件的内容进行合并,获得正确的查询结果。

总的来说,生成列加列优化后,读 I/O 只涉及到生成列表达式的引用列,写 I/O 只涉及到生成列本身的表达式结果,整个 Schema Change 的 I/O 效率相比完全重写有大幅提高,更好支持实时动态生成列加列的用户需求。

alt

效果验证

为了更好验证生成列对半结构化分析的加速效果,我们进行了简单的测试验证。

集群信息:StarRocks v3.1 1FE1BE ,104C376GB

创建一张如下的数据表,

CREATE TABLE `t` (
  `id` bigint(20) NOT NULL COMMENT "",
  `array_int` ARRAY<int(11)> NOT NULL COMMENT "",
  `json_data` json NOT NULL COMMENT "",
  `gc_1` double NULL AS array_avg(`test`.`t`.`array_int`) COMMENT "",
  `gc_2` ARRAY<int(11)> NULL AS array_sort(`test`.`t`.`array_int`) COMMENT "",
  `gc_3` varchar(65533) NULL AS get_json_string(json_string(`test`.`t`.`json_data`), '$.a') COMMENT ""
) ENGINE=OLAP 
PRIMARY KEY(`id`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`) BUCKETS 48 
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"storage_format" = "DEFAULT",
"enable_persistent_index" = "false",
"replicated_storage" = "true",
"compression" = "LZ4"
)

普通列数据创建方式: id,作为 primary key 列保证唯一。

array_int,长度为 10000 的 ARRAY ,保存的都是随机数。

json_data,包含两个 key,key "a" 对应的 value 为整型 1,key "b" 对应的value 是长度为 100 个 uuid 构成的字符串 性能测试使用下面的 query:

q1:SELECT get_json_string(json_string(json_data), '$.a') FROM A
q2:SELECT array_avg(array_int) FROM A;

测试结果:

alt

从上述的测试结果可知:

q1:使用生成列提取大 JSON 字段中的某个子字段,在查询阶段大幅节省了读取 JSON 字段的 I/O 消耗,查询性能提升达 4 倍以上。

q2:使用生成列对大 ARRAY 字段进行聚合计算(计算平均值),在查询阶段不仅节省读取该半结构化数据字段的 I/O 消耗,同时也大幅节省了 ARRAY 聚合计算所带来的 CPU 消耗,获得百倍的性能提升。

总结

生成列功能是一种加速半结构化分析的有效手段,当面对复杂的半结构化表达式计算时,可以为其添加对应的生成列,在导入阶段自动完成表达式计算,并将结果持久化。在查询阶段通过优化器的自动改写,直接从生成列中获得表达式计算结果,避免实时的表达式计算,实现透明加速。 通过使用生成列,用户能大幅减少查询时复杂表达式的 I/O,CPU 等资源消耗,在不同的场景下获得数倍甚至百倍的性能提升。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/332593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

align-item 和 align-content

align-item 和 align-content flex 布局中的 align-items 和 align-content 属性都用于垂直对齐 flex 容器内的项目&#xff0c;但它们适用于不同的情况&#xff1a; align-items: 这个属性用于在交叉轴上对齐单行内的 flex 项目。当你有一个 flex 容器&#xff0c;并且里面的…

【开源】基于JAVA的软件学院思政案例库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…

第16章_网络编程拓展练习(TCP编程,UDP编程)

文章目录 第16章_网络编程拓展练习TCP编程1、学生与老师交互2、查询单词3、拓展&#xff1a;查询单词4、图片上传5、拓展&#xff1a;图片上传6、多个客户端上传文件7、群聊 UDP编程8、群发消息 第16章_网络编程拓展练习 TCP编程 1、学生与老师交互 案例&#xff1a;客户端模…

回归预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SSA-BP麻雀算法优化BP神经网络多变量回归预测&#xff1b; 2.数据…

站长为什么都说WordPress太复杂不会用要放弃?

网络上经常看到有站长说要放弃WordPress&#xff0c;理由各有不同&#xff0c;比如有些说WordPress太复杂不会用&#xff1b;有些说WordPress是国外建站系统&#xff0c;在国内用来搭建访问速度太慢&#xff1b;也有些说WordPress是针对谷歌优化的&#xff0c;不适合国内的搜索…

打造更智能的应用 - 机器学习和Andorid

打造更智能的应用 - 机器学习和Andorid 一、关于机器学习和Andorid二、使用 Gemini 让您的 Android 应用如虎添翼2.1 Gemini API2.2 Android AICore 三、现成可用的还是自定义的机器学习3.1 机器学习套件 SDK 的常见用户流3.2 高性能自定义机器学习 四、机器学习套件 SDK&#…

如何用GPT进行数据处理?

详情点击链接&#xff1a;如何用GPT进行数据处理&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己…

C语言——整数和浮点数在内存中的存储

目录 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1 什么是大小端&#xff1f; 2.2 为什么有大小端? 2.3 练习 2.3.1 练习1 2.3.2 练习2 三、浮点数在内存中的存储 3.1练习 3.2 浮点数的存储 3.2.1浮点数存的过程 3.2.2浮点数取的过程 3.3 题目解…

什么是比特币?

比特币 比特币 &#xff08;英语&#xff1a;Bitcoin&#xff0c;缩写&#xff1a;BTC &#xff09;是一种基于 去中心化&#xff0c;采用 点对点网络&#xff0c;开放源代码&#xff0c;以 区块链 作为底层技术的 加密货币。比特币由 中本聪&#xff08;Satoshi Nakamoto&…

【C++】C++的IO流

一、C语言的输入与输出 C 语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf()。 scanf()&#xff1a;从标准输入设备&#xff08;键盘&#xff09;读取数据&#xff0c;并将值存放在变量中。printf()&#xff1a;将指定的文字/字符串输出到标准输出设备&#xff…

翻译: Streamlit从入门到精通六 实战缓存Cache请求数据

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四翻译…

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法

问题描述 问题1&#xff1a;当你使用FormData.from(Flutter3直接不能用)的时候&#xff0c;可能会提示没有这个方法&#xff0c;或者使用FormData.fromMap(flutter3的dio支持)的时候也提示没有&#xff0c;这时候可能就是和get库里面的Formdata冲突了 问题1&#xff1a;The me…

数据库经典面试题

习题一 1.1 创建表 ①创建Student表 mysql> create table Student ( -> Sno int primary key, -> Sname varchar(255), -> Ssex varchar(10), -> Sdept varchar(50) -> ); Query OK, 0 rows affected (0.01 sec) ②创建Course表 mysql…

物联网孢子捕捉分析仪在农田起到什么作用

TH-BZ03随着科技的飞速发展&#xff0c;物联网技术在农业领域的应用越来越广泛。其中&#xff0c;物联网孢子捕捉分析仪作为一种先进的设备&#xff0c;在农田中发挥着不可或缺的作用。本文将详细介绍物联网孢子捕捉分析仪在农田中的作用。 一、实时监测与预警 物联网孢子捕捉分…

TDengine 创始人陶建辉在汽车 CIOCDO 论坛发表演讲,助力车企数字化转型

当前&#xff0c;汽车行业的数字化转型如火如荼。借助数字技术的充分利用&#xff0c;越来越多的车企进一步提升了成本优化、应用敏捷性、高度弹性和效率。这一转型使得业务应用的开发和管理模式发生了颠覆性的创新&#xff0c;赋予了汽车软件快速响应变化和动态调度资源的能力…

FPGA引脚物理电平(内部资源,Select IO)-认知2

引脚电平 The SelectIO pins can be configured to various I/O standards, both single-ended and differential. • Single-ended I/O standards (e.g., LVCMOS, LVTTL, HSTL, PCI, and SSTL) • Differential I/O standards (e.g., LVDS, Mini_LVDS, RSDS, PPDS, BLVDS, and…

【RT-DETR有效改进】轻量化CNN网络MobileNetV2改进特征提取网络

前言 大家好&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持ResNet32、ResNet101和PP…

Debian 11.8.0 安装图解

引导和开始安装 这里直接回车确认即可&#xff0c;选择图形化安装方式。 选择语言 这里要区分一下&#xff0c;当前选中的语言作为安装过程中安装器所使用的语言&#xff0c;这里我们选择中文简体。不过细心的同学可能发现&#xff0c;当你选择安装器语言之后&#xff0c;后续安…

el-table实现搜索高亮展示并滚动到元素位置

效果展示&#xff1a; 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

Dubbo-admin监控中心

监控中心 Dubbo-admin监控中心执行操作启动provider和consumer项目进行测试总体流程 Dubbo-admin监控中心 dubbo-admin下载路径 git clone https://github.com/apache/dubbo-admin.git图1-1 dubbo-admin项目文件展示 执行操作 # 启动zookeeper# 前端 cd dubbo-admin-ui npm i…
最新文章