STRUCT
説明
STRUCT は複雑なデータ型を表現するために広く使用されています。異なるデータ型を持つ要素(フィールドとも呼ばれます)のコレクションを表します。例えば、<a INT, b STRING>
のように。
STRUCT 内のフィールド名は一意でなければなりません。フィールドは、プリミティブなデータ型(数値、文字列、日付など)や複雑なデータ型(ARRAY や MAP など)であることができます。
STRUCT 内のフィールドは、別の STRUCT、ARRAY、または MAP にすることもでき、これによりネストされたデータ構造を作成できます。例えば、STRUCT<a INT, b STRUCT<c INT, d INT>, c MAP<INT, INT>, d ARRAY<INT>>
のように。
STRUCT データ型は v3.1 以降でサポートされています。v3.1 では、StarRocks テーブルを作成する際に STRUCT カラムを定義し、そのテーブルに STRUCT データをロードし、MAP データをクエリできます。
v2.5 以降、StarRocks はデータレイクからの複雑なデータ型 MAP および STRUCT のクエリをサポートしています。StarRocks が提供する external catalog を使用して、Apache Hive™、Apache Hudi、Apache Iceberg から MAP および STRUCT データをクエリできます。データは ORC および Parquet ファイルからのみクエリできます。external catalog を使用して外部データソースをクエリする方法については、Overview of catalogs および必要な catalog タイプに関連するトピックを参照してください。
構文
STRUCT<name, type>
name
: フィールド名で、CREATE TABLE ステートメントで定義されたカラム名と同じです。type
: フィールドの型です。サポートされている任意の型を指定できます。
StarRocks で STRUCT カラムを定義する
テーブルを作成する際に STRUCT カラムを定義し、このカラムに STRUCT データをロードできます。
-- 一次元の struct を定義します。
CREATE TABLE t0(
c0 INT,
c1 STRUCT<a INT, b INT>
)
DUPLICATE KEY(c0);
-- 複雑な struct を定義します。
CREATE TABLE t1(
c0 INT,
c1 STRUCT<a INT, b STRUCT<c INT, d INT>, c MAP<INT, INT>, d ARRAY<INT>>
)
DUPLICATE KEY(c0);
-- NOT NULL の struct を定義します。
CREATE TABLE t2(
c0 INT,
c1 STRUCT<a INT, b INT> NOT NULL
)
DUPLICATE KEY(c0);
STRUCT 型のカラムには以下の制約があります:
- テーブルのキー カラムとして使用できません。値カラムとしてのみ使用できます。
- テーブルのパーティションキー カラム(PARTITION BY の後)として使用できません。
- テーブルのバケッティング カラム(DISTRIBUTED BY の後)として使用できません。
- 集計テーブル で値カラムとして使用する場合、replace() 関数のみをサポートします。
SQL で struct を構築する
STRUCT は、次の関数を使用して SQL で構築できます:row, struct、および named_struct。struct() は row() のエイリアスです。
row
とstruct
は名前のない struct をサポートします。フィールド名を指定する必要はありません。StarRocks は自動的にcol1
,col2
... のようなカラム名を生成します。named_struct
は名前付き struct をサポートします。名前と値の式はペアでなければなりません。
StarRocks は入力値に基づいて自動的に struct の型を決定します。
select row(1, 2, 3, 4) as numbers; -- {"col1":1,"col2":2,"col3":3,"col4":4} を返します。
select row(1, 2, null, 4) as numbers; -- {"col1":1,"col2":2,"col3":null,"col4":4} を返します。
select row(null) as nulls; -- {"col1":null} を返します。
select struct(1, 2, 3, 4) as numbers; -- {"col1":1,"col2":2,"col3":3,"col4":4} を返します。
select named_struct('a', 1, 'b', 2, 'c', 3, 'd', 4) as numbers; -- {"a":1,"b":2,"c":3,"d":4} を返します。
STRUCT データのロード
STRUCT データを StarRocks にロードするには、INSERT INTO と ORC/Parquet loading の2つの方法があります。
StarRocks はデータ型を対応する STRUCT 型に自動的にキャストすることに注意してください。名前付き struct カラムにデータをロードする際は、テーブル作成時に指定した順序で struct 内のフィールド名が並んでいることを確認してください。
INSERT INTO
CREATE TABLE t0(
c0 INT,
c1 STRUCT<a INT, b INT>
)
DUPLICATE KEY(c0);
INSERT INTO t0 VALUES(1, row(1, 1));
SELECT * FROM t0;
+------+---------------+
| c0 | c1 |
+------+---------------+
| 1 | {"a":1,"b":1} |
+------+---------------+
ORC/Parquet ファイルから STRUCT データをロードする
StarRocks の STRUCT データ型は、ORC または Parquet 形式のネストされたカラム構造に対応しています。追加の指定は必要ありません。ORC/Parquet loading の指示に従って、ORC または Parquet ファイルから STRUCT データをロードできます。
STRUCT フィールドへのアクセス
struct のサブフィールドをクエリするには、ドット (.
) 演算子を使用してフィールド名で値をクエリするか、[]
を使用してインデックスで値を呼び出すことができます。
mysql> select named_struct('a', 1, 'b', 2, 'c', 3, 'd', 4).a;
+------------------------------------------------+
| named_struct('a', 1, 'b', 2, 'c', 3, 'd', 4).a |
+------------------------------------------------+
| 1 |
+------------------------------------------------+
mysql> select row(1, 2, 3, 4).col1;
+-----------------------+
| row(1, 2, 3, 4).col1 |
+-----------------------+
| 1 |
+-----------------------+
mysql> select row(2, 4, 6, 8)[2];
+--------------------+
| row(2, 4, 6, 8)[2] |
+--------------------+
| 4 |
+--------------------+
mysql> select row(map{'a':1}, 2, 3, 4)[1];
+-----------------------------+
| row(map{'a':1}, 2, 3, 4)[1] |
+-----------------------------+
| {"a":1} |
+-----------------------------+