测试版本:Doris2.1.2版本(3fe+5be)
过去 Apache Doris 在应对复杂半结构化数据的存储和分析处理时,一般有两种方式:
1、一种方式是用户提前预定好表结构,加工成宽表,在数据进入前将数据解析好,这种方案的优点是写入性能好,查询也不需要解析,但是使用不够灵活、对表结构发起变更增加运维、研发的成本。
2、使用 Doris 中的 JSON 类型、或是存成 JSON String,将原始 JSON 数据不经过加工直接入库, 查询的时候,用解析函数处理。优点是不需要额外的数据加工、预定义表结构拍平嵌套结构,运维、研发方便,但存在解析性能以及数据读取效率低下的问题。
主要对第二点进行测试,基于github events一个小时的数据,数据文件大小605M
建表方式:
VARIANT数据类型建表
String数据类型建表
Json数据类型建表
导入时间对比:
VARIANT |
string |
json |
|
导入时间 |
2min37s |
8s |
7s |
压缩率对比:
VARIANT |
string |
json |
|
压缩前(M) |
605 |
605 |
605 |
压缩后(M) |
321 |
156 |
129 |
压缩比率 |
53% |
26% |
21% |
查询性能对比:
单列分组排序(一层嵌套) |
|||
VARIANT |
string |
json |
|
p1 |
0.05 |
0.03 |
0.03 |
p2 |
0.04 |
0.05 |
0.04 |
p3 |
0.04 |
0.04 |
0.03 |
sum |
0.13 |
0.12 |
0.1 |
过滤聚合统计次数 |
|||
p4 |
0.03 |
0.36 |
0.65 |
p5 |
0.03 |
0.34 |
0.65 |
p6 |
0.03 |
0.34 |
0.63 |
sum |
0.09 |
1.04 |
1.93 |
多列过滤分组聚合排序(解析两层嵌套) |
|||
p7 |
0.05 |
0.17 |
0.32 |
p8 |
0.05 |
0.19 |
0.32 |
p9 |
0.05 |
0.17 |
0.31 |
sum |
0.15 |
0.53 |
0.95 |
结论:
1、 VARIANT的数据导入相比json和string数据类型导入慢,因为json串的字段数过多,而在VARIANT类型的列创建了倒排索引,可能导致导入的速度变慢。
2、 压缩率在单列string和单列json存储压缩率更好,VARIANT的压缩率低于单列。
3、 在查询性能上,VARIANT整体情况是另外两种存储的4-8倍