メインコンテンツまでスキップ

ARRAY

ARRAY

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

ARRAYカラムの定義

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

-- 1次元配列の定義
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型の1次元配列として定義
create table t0(
c0 INT,
c1 ARRAY<INT>
)
duplicate key(c0)
distributed by hash(c0);

-- c1をVARCHAR(10)型のネストされた配列として定義
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カラムはDuplicate Keyテーブルのみで作成できます。v2.1以降では、他のタイプのテーブル(Primary Key、Unique Key、Aggregate)でもARRAYカラムを作成できます。Aggregateテーブルでは、そのカラムのデータを集約するために使用される関数がreplace()またはreplace_if_not_null()である場合のみ、ARRAYカラムを作成できます。詳細については、Aggregateテーブルを参照してください。
  • 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データをロードすることができます。

配列データのクエリ

配列の要素には、[]とサブスクリプトを使用してアクセスすることができます。サブスクリプトは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)