メインコンテンツまでスキップ
バージョン: 3.2

JSON

StarRocks は v2.2.0 から JSON データ型をサポートしています。このトピックでは、JSON の基本概念について説明します。また、JSON カラムの作成方法、JSON データのロード方法、JSON データのクエリ方法、および JSON 関数と演算子を使用して JSON データを構築および処理する方法についても説明します。

JSON とは

JSON は、半構造化データ用に設計された軽量のデータ交換フォーマットです。JSON はデータを階層的なツリー構造で表現し、さまざまなデータストレージおよび分析シナリオで柔軟で読み書きが容易です。JSON は NULL 値と、NUMBER、STRING、BOOLEAN、ARRAY、OBJECT のデータ型をサポートします。

JSON の詳細については、 JSON website をご覧ください。JSON の入力および出力構文については、 RFC 7159 の JSON 仕様を参照してください。

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 カラムにデータを書き込みます。以下の例では、tj という名前のテーブルが使用され、そのテーブルの j カラムは JSON カラムです。
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 関数は STRING データを JSON データとして解釈できます。json_object 関数は JSON オブジェクトを構築するか、既存のテーブルを JSON ファイルに変換できます。詳細については、 parse_json および json_object を参照してください。

  • 方法 2: Stream Load を使用して JSON ファイルをロードし、そのファイルを JSON データとして保存します。詳細については、 Load JSON data を参照してください。

    • ルート JSON オブジェクトをロードしたい場合は、jsonpaths$ に設定します。
    • JSON オブジェクトの特定の値をロードしたい場合は、jsonpaths$.a に設定します。ここで a はキーを指定します。StarRocks でサポートされている JSON パス式の詳細については、 JSON path を参照してください。
  • 方法 3: Broker Load を使用して Parquet ファイルをロードし、そのファイルを JSON データとして保存します。詳細については、 Broker Load を参照してください。

StarRocks は、Parquet ファイルのロード時に次のデータ型変換をサポートしています。

Parquet ファイルのデータ型JSON データ型
INTEGER (INT8, INT16, INT32, INT64, UINT8, UINT16, UINT32, and UINT64)NUMBER
FLOAT and DOUBLENUMBER
BOOLEANBOOLEAN
STRINGSTRING
MAPOBJECT
STRUCTOBJECT
LISTARRAY
その他のデータ型 (UNION や TIMESTAMP など)サポートされていません
  • 方法 4: Routine ロードを使用して、Kafka から StarRocks へ JSON データを継続的にロードします。

JSON データのクエリと処理

StarRocks は、JSON データのクエリと処理、および JSON 関数と演算子の使用をサポートしています。

以下の例では、tj という名前のテーブルが使用され、そのテーブルの j カラムが JSON カラムとして指定されています。

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: JSON カラムのデータをフィルタリングして、id=1 のフィルタ条件を満たすデータを取得します。

mysql> select * from tj where id = 1;
+------+---------------------+
| id | j |
+------+---------------------+
| 1 | {"a": 1, "b": true} |
+------+---------------------+

例 2: JSON カラム j のデータをフィルタリングして、指定されたフィルタ条件を満たすデータを取得します。

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: CAST 関数を使用して、テーブルの JSON カラムの値を BOOLEAN 値に変換します。その後、JSON カラムのデータをフィルタリングして、指定されたフィルタ条件を満たすデータを取得します。

mysql> select * from tj where cast(j->'b' as boolean);
+------+---------------------+
| id | j |
+------+---------------------+
| 1 | {"a": 1, "b": true} |
| 3 | {"a": 3, "b": true} |
+------+---------------------+

例 4: CAST 関数を使用して、テーブルの JSON カラムの値を BOOLEAN 値に変換します。その後、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 |
+----------------------------+

例 5: JSON カラムをソートキーとして使用して、テーブルのデータをソートします。

mysql> select * from tj
-> where j->'a' <= 3
-> order by cast(j->'a' as int);
+------+----------------------+
| id | j |
+------+----------------------+
| 1 | {"a": 1, "b": true} |
| 2 | {"a": 2, "b": false} |
| 3 | {"a": 3, "b": true} |
| 4 | {"a": 4, "b": false} |
+------+----------------------+
4 rows in set (0.05 sec)

JSON 関数と演算子

JSON 関数と演算子を使用して、JSON データを構築および処理できます。詳細については、 Overview of JSON functions and operators を参照してください。

制限事項と使用上の注意

  • JSON 値の最大長は 16 MB です。

  • ORDER BY、GROUP BY、および JOIN 句は JSON カラムへの参照をサポートしていません。JSON カラムへの参照を作成する場合は、CAST 関数を使用して JSON カラムを SQL カラムに変換してから参照を作成してください。詳細については、 cast を参照してください。

  • JSON カラムは、Duplicate Key、Primary Key、および Unique Key テーブルでサポートされています。集計テーブルではサポートされていません。

  • JSON カラムは、DUPLICATE KEY、PRIMARY KEY、および UNIQUE KEY テーブルのパーティションキー、バケッティングキー、またはディメンションカラムとして使用できません。また、ORDER BY、GROUP BY、および JOIN 句でも使用できません。

  • StarRocks は、JSON データをクエリするために次の JSON 比較演算子を使用することを許可しています: <, <=, >, >=, =, および !=IN を使用して JSON データをクエリすることは許可されていません。