メインコンテンツまでスキップ

JSON

#JSON

StarRocksはv2.2.0以降、JSONデータ型をサポートしています。このトピックでは、JSONの基本的な概念について説明します。また、JSON列の作成方法、JSONデータのロード方法、JSONデータのクエリ方法、およびJSON関数と演算子の使用方法について説明します。

JSONとは

JSONは、半構造化データ向けに設計された、軽量でデータの交換形式です。JSONはデータを階層的なツリー構造で表現し、幅広いデータストレージおよび分析シナリオで柔軟かつ読み書きしやすい形式でデータを表示します。JSONはNULL値と以下のデータ型をサポートしています: NUMBER、STRING、BOOLEAN、ARRAY、およびOBJECT。

JSONに関する詳細情報については、JSONのウェブサイトを参照してください。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データとして保存するための次の3つのメソッドを提供しています。

  • メソッド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データとして保存することができます。詳細については、JSONデータのロードを参照してください。
    • ルートのJSONオブジェクトをロードする場合、jsonpaths$に設定します。
    • JSONオブジェクトの特定の値をロードする場合、jsonpaths$.aに設定します。ここで、aはキーを指定します。StarRocksでサポートされているJSONパス式に関する詳細については、JSONパスを参照してください。
  • メソッド3: Broker Loadを使用してParquetファイルをロードし、ファイルをJSONデータとして保存することができます。詳細については、Broker Loadを参照してください。

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

Parquetファイルのデータ型

JSONデータ型

INTEGER (INT8、INT16、INT32、INT64、UINT8、UINT16、UINT32、およびUINT64)

NUMBER

FLOATおよびDOUBLE

NUMBER

BOOLEAN

BOOLEAN

STRING

STRING

MAP

OBJECT

STRUCT

OBJECT

LIST

ARRAY

UNIONおよびTIMESTAMPなどのその他のデータ型

サポートされていません

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データを返します。データの比較には最初の例を使用できます(この例では暗黙の変換が行われます)。代わりに、キャスト関数を使用して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' <= parse_json('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データを構築および処理することができます。詳細については、JSON関数と演算子の概要を参照してください。

制限事項と使用上の注意点

  • JSON値の最大長は16MBです。
  • ORDER BY、GROUP BY、およびJOIN句はJSON列への参照をサポートしていません。JSON列への参照を作成する場合は、参照を作成する前にJSON列をSQL列に変換するためにCAST関数を使用してください。詳細については、castを参照してください。
  • JSON列は、Duplicate Key、Primary Key、およびUnique Keyテーブルでサポートされていますが、Aggregateテーブルではサポートされていません。
  • JSON列は、DUPLICATE KEY、PRIMARY KEY、およびUNIQUE KEYテーブルのパーティションキー、バケティングキー、または次元列として使用することはできません。ORDER BY、GROUP BY、およびJOIN句で使用することもできません。
  • StarRocksでは、以下のJSON比較演算子を使用してJSONデータをクエリすることができます:<<=>>==、および!=INを使用してJSONデータをクエリすることはできません。