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

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)
Rocky the happy otterStarRocks Assistant

AI generated answers are based on docs and other sources. Please test answers in non-production environments.