Flat JSON
Public Preview
この記事では、Flat JSON の基本概念とこの機能の使用方法を紹介します。
バージョン 2.2.0 か ら、StarRocks は JSON データ型をサポートし、より柔軟なデータストレージを可能にしています。しかし、JSON をクエリする際、ほとんどのシナリオでは JSON データ全体を直接読み取るのではなく、指定されたパスのデータにアクセスします。例えば:
-- 必要なフィールドをログに固定フィールドとして保存し、頻繁に変更される他のフィールドを JSON としてパッケージ化します。
SELECT
time,
event,
user,
get_json_string(remain_json, "$.from_system"),
get_json_string(remain_json, "$.tag")
FROM logs;
JSON 型の特性により、クエリのパフォーマンスは標準型(INT、STRING など)ほど良くありません。その理由は以下の通りです:
- ストレージのオーバーヘッド:JSON は半構造化型であり、各行の構造 情報を保存する必要があるため、ストレージの使用量が多く、圧縮効率が低いです。
- クエリの複雑さ:クエリはランタイムデータに基づいてデータ構造を検出する必要があり、ベクトル化された実行最適化を達成するのが難しいです。
- 冗長データ:クエリは JSON データ全体を読み取る必要があり、多くの冗長なフィールドを含んでいます。
StarRocks は、JSON データのクエリ効率を向上させ、JSON の使用の複雑さを軽減するために Flat JSON 機能を導入しました。
- この機能はバージョン 3.3.0 から利用可能で、デフォルトでは無効になっており、手動で有効にする必要があります。
Flat JSON とは
Flat JSON の核心原理は、ロード中に JSON データを検出し、JSON データから共通フィールドを抽出して標準型データとして保存することです。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}
上記の JSON データをロードする際、フィールド a
と b
はほとんどの JSON データに存在し、類似のデータ型(どちらも INT)を持っています。したがって、フィールド a
と b
のデータは JSON から抽出され、2 つの INT 列として別々に保存されます。これらの 2 つの列がクエリで使用されるとき、追加の JSON フィールドを処理することなくデータを直接読み取ることができ、JSON 構造を処理する計算オーバーヘッドを削減します。