メインコンテンツまでスキップ
バージョン: Stable-3.3

ARRAY

ARRAY はデータベースの拡張型として、PostgreSQL、ClickHouse、Snowflake などのさまざまなデータベースシステムでサポートされています。ARRAY は A/B テスト、ユーザータグ分析、ユーザープロファイリングなどのシナリオで広く使用されています。StarRocks は多次元配列のネスト、配列のスライス、比較、フィルタリングをサポートしています。

ARRAY カラムの定義

テーブルを作成する際に ARRAY カラムを定義できます。

-- 一次元配列を定義します。
ARRAY<type>

-- ネストされた配列を定義します。
ARRAY<ARRAY<type>>

-- 配列カラムを NOT NULL として定義します。
ARRAY<type> NOT NULL

type は配列内の要素のデータ型を指定します。StarRocks は次の要素型をサポートしています: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, VARCHAR, CHAR, DATETIME, DATE, JSON, ARRAY (v3.1 以降), MAP (v3.1 以降), STRUCT (v3.1 以降)。

配列内の要素はデフォルトで NULL 可能です。例えば、[null, 1 ,2] のように。配列内の要素を NOT NULL として指定することはできませんが、テーブル作成時に ARRAY カラムを NOT NULL として指定することは可能です。以下のコードスニペットの3番目の例を参照してください。

例:

-- c1 を要素型が INT の一次元配列として定義します。
create table t0(
c0 INT,
c1 ARRAY<INT>
)
duplicate key(c0)
distributed by hash(c0);

-- c1 を要素型が VARCHAR のネストされた配列として定義します。
create table t1(
c0 INT,
c1 ARRAY<ARRAY<VARCHAR(10)>>
)
duplicate key(c0)
distributed by hash(c0);

-- c1 を NOT NULL の配列カラムとして定義します。
create table t2(
c0 INT,
c1 ARRAY<INT> NOT NULL
)
duplicate key(c0)
distributed by hash(c0);

制限事項

StarRocks テーブルで ARRAY カラムを作成する際には、以下の制限があります:

  • v2.1 より前のバージョンでは、ARRAY カラムは重複キーテーブルでのみ作成できます。v2.1 以降では、他のタイプのテーブル(Primary Key、Unique Key、集計)でも ARRAY カラムを作成できます。ただし、集計テーブルでは、そのカラムでデータを集計するために使用される関数が replace() または replace_if_not_null() の場合にのみ ARRAY カラムを作成できます。詳細は Aggregate table を参照してください。
  • ARRAY カラムはキー列として使用できません。
  • ARRAY カラムはパーティションキー(PARTITION BY に含まれる)やバケッティングキー(DISTRIBUTED BY に含まれる)として使用できません。
  • DECIMAL V3 は ARRAY でサポートされていません。
  • 配列は最大14レベルのネストが可能です。

SQL で配列を構築する

配列は、SQL で角括弧 [] を使用して構築でき、各配列要素はカンマ(,)で区切られます。

mysql> select [1, 2, 3] as numbers;

+---------+
| numbers |
+---------+
| [1,2,3] |
+---------+

mysql> select ["apple", "orange", "pear"] as fruit;

+---------------------------+
| fruit |
+---------------------------+
| ["apple","orange","pear"] |
+---------------------------+

mysql> select [true, false] as booleans;

+----------+
| booleans |
+----------+
| [1,0] |
+----------+

StarRocks は、配列が複数の型の要素で構成されている場合、自動的にデータ型を推論します:

mysql> select [1, 1.2] as floats;
+---------+
| floats |
+---------+
| [1.0,1.2] |
+---------+

mysql> select [12, "100"];

+--------------+
| [12,'100'] |
+--------------+
| ["12","100"] |
+--------------+

宣言された配列型を示すために、尖括弧 (<>) を使用できます。

mysql> select ARRAY<float>[1, 2];

+-----------------------+
| ARRAY<float>[1.0,2.0] |
+-----------------------+
| [1,2] |
+-----------------------+

mysql> select ARRAY<INT>["12", "100"];

+------------------------+
| ARRAY<int(11)>[12,100] |
+------------------------+
| [12,100] |
+------------------------+

要素に NULL を含めることができます。

mysql> select [1, NULL];

+----------+
| [1,NULL] |
+----------+
| [1,null] |
+----------+

空の配列の場合、宣言された型を示すために尖括弧を使用することも、StarRocks がコンテキストに基づいて型を推論するために直接 [] と書くこともできます。StarRocks が型を推論できない場合、エラーが報告されます。

mysql> select [];

+------+
| [] |
+------+
| [] |
+------+

mysql> select ARRAY<VARCHAR(10)>[];

+----------------------------------+
| ARRAY<unknown type: NULL_TYPE>[] |
+----------------------------------+
| [] |
+----------------------------------+

mysql> select array_append([], 10);

+----------------------+
| array_append([], 10) |
+----------------------+
| [10] |
+----------------------+

配列データのロード

StarRocks は、配列データのロードを3つの方法でサポートしています:

  • INSERT INTO は小規模データのテストロードに適しています。
  • Broker Load は大規模データの ORC または Parquet ファイルのロードに適しています。
  • Stream Load と Routine Load は大規模データの CSV ファイルのロードに適しています。

INSERT INTO を使用して配列をロードする

INSERT INTO を使用して、小規模データをカラムごとにロードしたり、データをロードする前に ETL を実行したりできます。

create table t0(
c0 INT,
c1 ARRAY<INT>
)
duplicate key(c0)
distributed by hash(c0);

INSERT INTO t0 VALUES(1, [1,2,3]);

Broker Load を使用して ORC または Parquet ファイルから配列をロードする

StarRocks の配列型は ORC および Parquet ファイルのリスト構造に対応しており、StarRocks で異なるデータ型を指定する必要がありません。データロードの詳細については、Broker load を参照してください。

Stream Load または Routine Load を使用して CSV 形式の配列をロードする

CSV ファイル内の配列はデフォルトでカンマで区切られています。Stream Load または Routine Load を使用して、CSV テキストファイルや Kafka 内の CSV データをロードできます。

ARRAY データのクエリ

配列内の要素には、[] と添字を使用してアクセスできます。添字は 1 から始まります。

mysql> select [1,2,3][1];

+------------+
| [1,2,3][1] |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)

添字が 0 または負の数の場合、エラーは報告されず、NULL が返されます

mysql> select [1,2,3][0];

+------------+
| [1,2,3][0] |
+------------+
| NULL |
+------------+
1 row in set (0.01 sec)

添字が配列の長さ(配列内の要素数)を超える場合、NULL が返されます

mysql> select [1,2,3][4];

+------------+
| [1,2,3][4] |
+------------+
| NULL |
+------------+
1 row in set (0.01 sec)

多次元配列の場合、要素は再帰的にアクセスできます。

mysql(ARRAY)> select [[1,2],[3,4]][2];

+------------------+
| [[1,2],[3,4]][2] |
+------------------+
| [3,4] |
+------------------+
1 row in set (0.00 sec)

mysql> select [[1,2],[3,4]][2][1];

+---------------------+
| [[1,2],[3,4]][2][1] |
+---------------------+
| 3 |
+---------------------+
1 row in set (0.01 sec)