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 型カラムの作成
テーブルを作成する際に、カラム j
を JSON 型として指定するには、キーワード 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 |
+----------------------------+
例 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} |
+------+----------------------+
JSON 関数とオペレーター
JSON 関数とオペレーターを使用して JSON データを構築および処理できます。詳細については、JSON Functions and Operators を参照してください。
JSON 配列
JSON は、オブジェクト、配列、または他の JSON データ型を配列内にネストすることができます。StarRocks は、これらの複雑なネストされた JSON データ構造を処理するための豊富な関数とオペレーターを提供しています。以下では、配列を含む JSON データを処理する方法を紹介します。
events
テーブルに event_data
という JSON フィールドがあり、以下の内容が含まれているとします。
{
"user": "Alice",
"actions": [
{"type": "click", "timestamp": "2024-03-17T10:00:00Z", "quantity": 1},
{"type": "view", "timestamp": "2024-03-17T10:05:00Z", "quantity": 2},
{"type": "purchase", "timestamp": "2024-03-17T10:10:00Z", "quantity": 3}
]
}
以下の例は、いくつかの一般的な JSON 配列分析シナリオを示しています。
- 配列要素の抽出: actions 配列から type、timestamp などの特定のフィールドを抽出し、投影操作を行います。
- 配列の展開:
json_each
関数を使用して、ネストされた JSON 配列を複数行・複数列のテーブル構造に展開し、後続の分析を行います。 - 配列の計算: 配列関数を使用して、配列要素をフィルタリング、変換、集計します。たとえば、特定のタイプの操作の数をカウントします。