StarRocks 近期发布了 v1.17 / v1.18 两个大版本,下面介绍一下新增的核心功能:
Lateral Join & Unnest
一行转多行是ETL处理过程中的常见操作,借助中间表的处理方式往往不够优雅。StarRocks 在v1.18版中实现了 Lateral join+unnest table function,可以轻松地使 unnest table function 引用左表的属性,从而方便进一步的数据分析。
通过 Lateral join+unnest,我们可以实现以下功能:
- Array 展开成多行。
- 配合 split 函数,能够将逗号分隔的字符串展开成多行。
- 配合 bitmap_to_array 函数,能够将 Bitmap 类型转成多行ID。一方面提升 Bitmap 转化ID的效率,一方面方便对ID进行进一步分析。
例如:我们有一张名为user的原始表。user_id列为用户id,label列为该用户基本信息的array。如下表所示:
SELECT * FROM user;
+---------+-----------------------+
| user_id | label |
+---------+-----------------------+
| 1 | ['male','student'] |
| 2 | ['male','employee'] |
| 3 | ['female','employee'] |
| 4 | ['male','student'] |
+---------+-----------------------+
通过 Lateral join 和 unnest 的配合,我们可以快速将 label 进行拆解,并按照标签进行分析,例如计算出每一标签下的用户数:
# 一般写法
SELECT unnest, COUNT(unnest)
FROM user
CROSS JOIN LATERAL UNNEST(label)
GROUP BY unnest;
# 简单写法
SELECT unnest, COUNT(unnest)
FROM user, UNNEST(label)
GROUP BY unnest;
# 两种写法均可得到同样的结果
+----------+-----------------+
| unnest | COUNT('unnest') |
+----------+-----------------+
| female | 1 |
| male | 3 |
| employee | 2 |
| student | 2 |
+----------+-----------------+
# 其中,lateral join+unnest得到的行转列中间结果示意:
+---------+----------+
| user_id | unnest |
+---------+----------+
| 1 | male |
| 1 | student |
| 2 | male |
| 2 | employee |
| 3 | female |
| 3 | employee |
| 4 | male |
| 4 | student |
+---------+----------+
参考文档:https://docs.starrocks.com/zh...
Fast Decimal
数据库中,Decimal 用于存储精确的浮点数,例如金融系统中多使用 Decimal 存储交易数据。StarRocks 在v1.18版中升级至 Fast Decimal,支持了更高精度并提升了算术运算性能,主要优化有:
- 支持表示更宽的 Decimal 数据类型,有效数字可达38位。
- 内部支持多种宽度的整数表示 Decimal。Decimal(M<=18, D)使用64bit整数,相比于原来统一采用的128bit整数,在算数运算和转换运算上将使用更少的指令数量,因此性能有大幅提升。
- 在原有基础上做了极致的算法优化,尤其是乘法运算,相较原来性能有4倍左右,测试结果如下:
Bitmap 优化
Bitmap 在高基数的数据分析、精确去重等场景中具有明显优势。利用Bitmap在时间和空间上的计算优势,用户可以对数据进行快速的定位和筛选,以服务于用户画像、人群圈选、留存率计算等业务场景。近期,StarRocks 对 Bitmap 函数进行了进一步完善,包含 bitmap_andnot,bitmap_xor, bitmap_remove ,同时提供差集,异或和删除的操作。
- bitmap_andnot(BITMAP lhs, BITMAP rhs):返回在 lhs 中但不在 rhs 中的集合(差集)。参考文档:https://docs.starrocks.com/zh...
- bitmap_xor(BITMAP lhs, BITMAP rhs):返回 lhs 独有或者 rhs 独有的元素所构成的集合(并集-交集)。参考文档:https://docs.starrocks.com/zh...
- bitmap_remove(BITMAP lhs, BIGINT input):从 lhs 中删除 input 作为结果集合返回参考文档:https://docs.starrocks.com/zh...
在性能方面,通过对 Bitmap 的存储结构和 SIMD指令 优化,获得了2-10倍性能提升。
其他优化
导入优化
- Broker load 新增支持 ZSTD格式 压缩文件
- 大规模数据导入稳定性提升,可以完成1000列、10TB规模的单表稳定导入
存储优化
- Bitmap 存储格式优化,对bitmap_union,bitmap_union_count 有10倍左右的性能提升
- 列名支持空格和中文字符等特殊字符
算子优化
- Delete 语法增强,支持in表达式,支持不指定分区删除
- TopN排序性能提升,针对 order by col1 limit n 这类查询,当n在十万到数百万规模时,有50% ~ 150% 的性能提升
- HyperLogLog 相关函数提升至原有性能的3~5倍
生态丰富
- Tableau 兼容性提升:TBVT 兼容性提升到95% ,ODBC5 connector 兼容性可以到98%
- Hive外表支持ViewFs
更多详情可以参考论坛的Release Notes(v1.18版:https://forum.starrocks.com/t...;v1.17版:https://forum.starrocks.com/t...),欢迎大家提出宝贵意见,如有更多期待功能请加入交流群告诉我们。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。