VARIANT
VARIANT型はIceberg Catalogのテーブルでのみサポートされています。StarRocksネイティブテーブルではサポートされていません。
v4.1以降、StarRocksはParquet形式のIcebergテーブルから半構造化データをクエリするためのVARIANTデータ型をサポートしています。この記事では、VARIANTの基本概念と、StarRocksがVARIANT型データをクエリしてVARIANT関数で処理する方法を紹介します。
VARIANTとは
VARIANTは、プリミティブ型(整数、浮動小数点数、文字列、ブール値、日付、タイムスタンプ)や複合型(構造体、マップ、配列)を含む、さまざまなデータ型の値を格納できる半構造化データ型です。VARIANTデータは、効率的なストレージとクエリのためにバイナリ形式でエンコードされます。
VARIANT型は、バリアントエンコーディングを使用したParquet形式のApache Icebergテーブルのデータを扱う際に特に有用であり、柔軟なスキーマ進化と異種データの効率的なストレージを可能にします。
Parquetバリアントエンコーディング形式の詳細については、Parquet Variant Encoding仕様を参照してください。
VARIANTデータの使用
IcebergテーブルからのVARIANT型データのクエリ
StarRocksは、Parquet形式で保存されたIcebergテーブルからVARIANT型データのクエリをサポートしています。VARIANTカラムは、ParquetのバリアントエンコーディングをするIcebergテーブルをクエリする際に自動的に認識されます。
VARIANTカラムを持つIcebergテーブルのクエリ例:
-- VARIANTカラムを持つテーブルのクエリ
SELECT
id,
variant_col
FROM iceberg_catalog.db.table_with_variants;
VARIANTデータからの値の抽出
StarRocksは、VARIANTデータから型付きの値を抽出するためのいくつかの関数を提供しています。
例1:型付きゲッター関数を使用してプリミティブ値を抽出する。
SELECT
get_variant_int(variant_col, '$') AS int_value,
get_variant_string(variant_col, '$') AS string_value,
get_variant_bool(variant_col, '$') AS bool_value,
get_variant_double(variant_col, '$') AS double_value
FROM iceberg_catalog.db.table_with_variants;
例2:JSONパス式を使用してネストされた構造をナビゲートする。
SELECT
get_variant_string(variant_col, '$.user.name') AS user_name,
get_variant_int(variant_col, '$.user.age') AS user_age,
get_variant_string(variant_col, '$.address.city') AS city
FROM iceberg_catalog.db.table_with_variants;
例3:配列要素にアクセスする。
SELECT
get_variant_int(variant_col, '$.scores[0]') AS first_score,
get_variant_int(variant_col, '$.scores[1]') AS second_score
FROM iceberg_catalog.db.table_with_variants;
例4:ネストされたバリアントデータをクエリしてVARIANT型を返す。
SELECT
variant_query(variant_col, '$.metadata') AS metadata,
variant_query(variant_col, '$.items[0]') AS first_item
FROM iceberg_catalog.db.table_with_variants;
例5:VARIANT値の型を確認する。
SELECT
variant_typeof(variant_col) AS root_type,
variant_typeof(variant_query(variant_col, '$.data')) AS data_type
FROM iceberg_catalog.db.table_with_variants;
JSONからVARIANTへのキャスト
StarRocksはJSON値をVARIANTにキャストすることをサポートしています。入力がSTRINGの場合は、まずJSONに変換してください。
SELECT
CAST(parse_json('{"id": 1, "flags": {"active": true}, "scores": [1.5, null]}') AS VARIANT) AS variant_value;
SELECT
CAST(json_col AS VARIANT) AS variant_value
FROM db.table_with_json;
VARIANTデータのSQLデータ型へのキャスト
CAST関数を使用して、VARIANTデータを標準SQLデータ型に変換できます:
SELECT
CAST(variant_query(variant_col, '$.count') AS INT) AS count,
CAST(variant_query(variant_col, '$.price') AS DECIMAL(10, 2)) AS price,
CAST(variant_query(variant_col, '$.active') AS BOOLEAN) AS is_active,
CAST(variant_query(variant_col, '$.name') AS STRING) AS name
FROM iceberg_catalog.db.table_with_variants;
複合型もVARIANTからキャストできます:
SELECT
CAST(variant_col AS STRUCT<id INT, name STRING>) AS user_struct,
CAST(variant_col AS MAP<STRING, INT>) AS config_map,
CAST(variant_col AS ARRAY<DOUBLE>) AS values_array
FROM iceberg_catalog.db.table_with_variants;