STRUCT
Description
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 catalogs を使用して、Apache Hive™、Apache Hudi、および Apache Iceberg から MAP および STRUCT データをクエリできます。ORC および Parquet ファイルからのみデータをクエリできます。external catalogs を使用して外部データソースをクエリする方法の詳細については、 Overview of catalogs および必要な catalog タイプに関連するトピックを参照してください。
Syntax
STRUCT<name, type>
name
: フィールド名で、CREATE TABLE ステートメントで定義されたカラム名と同じです。type
: フィールドの型です。サポートされている任意の型であることができます。
Define a STRUCT column in StarRocks
テーブルを作成する際に 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 の後)として使用できません。
- Aggregate table の値カラムとして使用する場合、replace() 関数のみサポートされます。
Construct structs in SQL
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} を返します。
Load STRUCT data
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} |
+------+---------------+
Load STRUCT data from ORC/Parquet files
StarRocks の STRUCT データ型は、ORC または Parquet 形式のネストされたカラム構造に対応しています。追加の指定は必要ありません。 ORC/Parquet loading の指示に従って、ORC または Parquet ファイルから STRUCT データをロードできます。
Access STRUCT fields
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} |
+-----------------------------+