StarRocks中的Flat JSON技术解析与使用指南
什么是Flat JSON
在StarRocks 2.2.0版本中引入了JSON数据类型支持,为数据存储提供了更大的灵活性。然而,直接查询JSON数据存在几个关键性能问题:
- 存储开销大:JSON作为半结构化类型,需要保存每行的结构信息,导致存储空间占用大且压缩效率低
- 查询复杂度高:查询时需要实时解析JSON结构,难以实现向量化执行优化
- 数据冗余:即使只需要访问部分字段,也必须读取整个JSON对象
为解决这些问题,StarRocks 3.3.0版本引入了Flat JSON功能,其核心原理是在数据加载时自动分析JSON结构,将高频访问的公共字段提取为独立的标准类型列存储,从而显著提升查询效率。
Flat JSON工作原理
假设有以下JSON数据:
1, {"a": 1, "b": 21, "c": 3, "d": 4}
2, {"a": 2, "b": 22, "d": 4}
3, {"a": 3, "b": 23, "d": [1, 2, 3, 4]}
4, {"a": 4, "b": 24, "d": null}
5, {"a": 5, "b": 25, "d": null}
6, {"c": 6, "d": 1}
Flat JSON处理流程:
- 分析发现字段
a
和b
在大多数JSON中出现且类型相似(均为INT) - 将这两个字段提取为独立的INT类型列存储
- 查询时可直接访问这些列,无需解析完整JSON
功能启用与配置
启用方式
方法一:建表时指定(仅限共享无集群)
CREATE TABLE `t1` (
`k1` int,
`k2` JSON
)
PROPERTIES (
"flat_json.enable" = "true",
"flat_json.null.factor" = "0.5",
"flat_json.sparsity.factor" = "0.5",
"flat_json.column.max" = "50"
);
方法二:修改表属性
ALTER TABLE t1 SET ("flat_json.enable" = "true");
方法三:BE配置(3.4版本前)
- 修改BE配置:
enable_json_flat = true
- 启用FE剪枝功能:
SET GLOBAL cbo_prune_json_subfield = true;
关键配置参数
| 参数名 | 描述 | 默认值 | |--------|------|--------| | flat_json.enable | 是否启用Flat JSON | false | | flat_json.null.factor | NULL值比例阈值,超过则不提取 | 0.5 | | flat_json.sparsity.factor | 稀疏度阈值,超过则不提取 | 0.5 | | flat_json.column.max | 最大提取列数 | 50 |
使用示例
- 创建表并加载数据
CREATE TABLE `t1` (
`k1` int,
`k2` JSON
) PROPERTIES ("flat_json.enable" = "true");
INSERT INTO t1 VALUES
(11, parse_json('{"str":"test","Integer":123456}')),
(12, parse_json('{"str":"demo","Integer":789012}'));
- 查看提取的子列
SELECT flat_json_meta(k2) FROM t1[_META_];
- 执行查询
-- 直接访问提取的字段
SELECT k2->'Integer' FROM t1 WHERE k2->'str' = 'test';
性能监控
通过Query Profile可监控Flat JSON效果:
PushdownAccessPaths
:下推到存储的子字段路径数AccessPathHits
:Flat JSON子字段命中次数AccessPathUnhits
:未命中次数JsonFlattern
:现场提取子列耗时
版本兼容性与限制
版本演进
- 3.3.0-3.3.2:提取字段保存为JSON类型,保留原始数据
- 3.3.3+:自动类型推断(BIGINT/DOUBLE/STRING等),仅保存提取字段
使用限制
- 历史数据需重新加载或Compaction后才会应用优化
- 启用后会增加数据加载时间
- 仅支持JSON对象内的公共键,不支持数组内键
- 不影响原有数据排序方式,压缩率可能受影响
最佳实践建议
- 字段选择:优先提取高频访问、低NULL率、类型一致的字段
- 监控调整:定期检查Query Profile,调整提取策略
- 版本规划:3.3.3+版本提供更好的类型推断和存储效率
- 资源权衡:在查询性能提升和加载时间增加间找到平衡点
通过合理使用Flat JSON功能,可以在StarRocks中实现接近原生列式存储的JSON查询性能,为半结构化数据分析提供高效解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考