JSON
バージョン 2.2.0 以降、StarRocks は JSON をサポートしています。この記事では、JSON の基本概念、StarRocks が JSON 型のカラムを作成し、JSON データをロードおよびクエリし、JSON 関数と演算子を通じて JSON データを構築および処理する方法を紹介します。
JSON とは
JSON は軽量なデータ交換フォーマットです。JSON 型データは半構造化されており、ツリー構造をサポートしています。JSON データは階層的で柔軟性があり、読みやすく処理しやすいため、データストレージや分析のシナリオで広く使用されています。JSON は、NUMBER、STRING、BOOLEAN、ARRAY、OBJECT、および NULL 値などのデータ型をサポートしています。
JSON の詳細については、JSON 公式ウェブサイト を参照してください。JSON データの入力および出力の構文については、JSON 仕様 RFC 7159 を参照してください。
StarRocks は JSON データの保存と効率的なクエリおよび分析をサポートしています。StarRocks は、入力テキストを直接保存するのではなく、バイナリ形式のエンコーディングを使用して JSON データを保存し、データ計算お よびクエリ中の解析コストを削減し、クエリ効率を向上させます。
JSON データの使用
JSON 型カラムの作成
テーブルを作成する際、キーワード JSON
を使用してカラム j
を JSON 型として指定します。
CREATE TABLE `tj` (
`id` INT(11) NOT NULL COMMENT "",
`j` JSON NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`id`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"replication_num" = "3",
"storage_format" = "DEFAULT"
);
データのロードと JSON 型としての保存
StarRocks は、データをロードして JSON 型として保存するための以下の方法をサポートしています。
- 方法 1:
INSERT INTO
を使用して JSON 型カラム(例: カラムj
)にデータを書き込みます。
INSERT INTO tj (id, j) VALUES (1, parse_json('{"a": 1, "b": true}'));
INSERT INTO tj (id, j) VALUES (2, parse_json('{"a": 2, "b": false}'));
INSERT INTO tj (id, j) VALUES (3, parse_json('{"a": 3, "b": true}'));
INSERT INTO tj (id, j) VALUES (4, json_object('a', 4, 'b', false));
PARSE_JSON 関数は、文字列型データに基づいて JSON 型データを構築できます。JSON_OBJECT 関数は JSON オブジェクト型データを構築でき、既存のテーブルを JSON 型に変換することができます。詳細については、PARSE_JSON および JSON_OBJECT を参照してください。
-
方法 2: Stream Load を使用して JSON ファイルをインポートし、JSON 型として保存します。インポート方法については、Import JSON Data を参照してください。
- JSON ファイルのルートノードにある JSON オブジェクトを JSON 型としてインポートして保存するには、
jsonpaths
を$
に設定します。 - JSON ファイル内の JSON オブジェクトの値を JSON 型としてインポートして保存するには、
jsonpaths
を$.a
に設定します(ここでa
はキーを表します)。その他の JSON パス式については、JSON path を参照してください。
- JSON ファイルのルートノードにある JSON オブジェクトを JSON 型としてインポートして保存するには、
-
方法 3: Broker Load を使用して Parquet ファイルをインポートし、JSON 型として保存します。インポート方法については、Broker Load を参照してください。
インポート中に以下のようにデータ型の変換 がサポートされています。
Parquet ファイルのデータ型 | 変換後の JSON データ型 |
---|---|
整数型 (INT8, INT16, INT32, INT64, UINT8, UINT16, UINT32, UINT64) | JSON Number |
浮動小数点型 (FLOAT, DOUBLE) | JSON Number |
BOOLEAN | JSON Boolean |
STRING | JSON String |
MAP | JSON Object |
STRUCT | JSON Object |
LIST | JSON Array |
UNION, TIMESTAMP, その他の型 | サポートされていません |
- 方法 4: Routine Load を使用して、Kafka から JSON 形式のデータを継続的に消費し、StarRocks にインポートします。
JSON 型データのクエリと処理
StarRocks は JSON 型データのクエリと処理をサポートし、JSON 関数と演算子を使用することができます。
この例では、テーブル tj
を使用して説明します。
mysql> select * from tj;
+------+----------------------+
| id | j |
+------+----------------------+
| 1 | {"a": 1, "b": true} |
| 2 | {"a": 2, "b": false} |
| 3 | {"a": 3, "b": true} |
| 4 | {"a": 4, "b": false} |
+------+----------------------+
例 1: 条件 id=1
を満たす JSON 型カラムのデータをフィルタリングします。
mysql> select * from tj where id = 1;
+------+---------------------+
| id | j |
+------+---------------------+
| 1 | {"a": 1, "b": true} |
+------+---------------------+
例 2: JSON 型カラムに基づいてテーブル内のデータをフィルタリングします。
以下の例では、
j->'a'
は JSON 型データを返します。最初の例と比較して、データに対して暗黙の変換を行います 。または、CAST 関数を使用して JSON 型データを INT に構築して比較します。
mysql> select * from tj where j->'a' = 1;
+------+---------------------+
| id | j |
+------+---------------------+
| 1 | {"a": 1, "b": true} |
+------+---------------------+
mysql> select * from tj where cast(j->'a' as INT) = 1;
+------+---------------------+
| id | j |
+------+---------------------+
| 1 | {"a": 1, "b": true} |
+------+---------------------+
例 3: JSON 型カラムに基づいてテーブル内のデータをフィルタリングします(CAST 関数を使用して JSON 型カラムを BOOLEAN 型として構築できます)。
mysql> select * from tj where cast(j->'b' as boolean);
+------+---------------------+
| id | j |
+------+---------------------+
| 1 | {"a": 1, "b": true} |
| 3 | {"a": 3, "b": true} |
+------+---------------------+
例 4: 条件を満たす JSON 型カラムのデータをフィルタリングし、数値演算を行います。
mysql> select cast(j->'a' as int) from tj where cast(j->'b' as boolean);
+-----------------------+
| CAST(j->'a' AS INT) |
+-----------------------+
| 3 |
| 1 |
+-----------------------+
mysql> select sum(cast(j->'a' as int)) from tj where cast(j->'b' as boolean);
+----------------------------+
| sum(CAST(j->'a' AS INT)) |
+----------------------------+
| 4 |
+----------------------------+