Amazon S3 からのバッチデータロード
CelerData は、AWS S3 からデータをロードするために以下のオプションを提供しています。
- INSERT+
FILES()
を使用した同期ロード - Broker Load を使用した非同期ロード
これらのオプションにはそれぞれ利点があり、詳細は以下のセクションで説明します。ほとんどの場合、使用が簡単な INSERT+FILES()
メソッドをお勧めします。ただし、INSERT+FILES()
メソッドは現在、Parquet と ORC ファイル形式のみをサポートしています。そのため、CSV などの他のファイル形式のデータをロードする必要がある場合や、データロード中に DELETE などのデータ変更を行う必要がある場合は、Broker Load を利用できます。
始める前に
ソースデータの準備
CelerData にロードしたいソースデータが S3 バケットに適切に保存されていることを確認してください。また、データとデータベースの場所を考慮することもお勧めします。バケットと CelerData が同じリージョンにある場合、データ転送コストは大幅に低くなります。
このトピックでは、S3 バケット内のサンプルデータセット s3://starrocks-examples/user_behavior_ten_million_rows.parquet
を提供します。このデータセットには、AWS 認証済みユーザーであれば有効な資格情報でアクセスできます。
権限の確認
CelerData クラスター内のテーブルにデータをロードするには、そのテーブルに対する INSERT 権限を持つユーザーとしてのみ可能です。INSERT 権限がない場合は、GRANT に従って、CelerData クラスターに接続するために使用するユーザーに INSERT 権限を付与してください。
認証情報の収集
このトピックの例では、IAM ユーザー認証を使用しています。AWS S3 からデータを読み取る権限を持っていることを確認するために、IAM ユーザー認証の準備 を読み、適切な IAM ポリシー を設定した IAM ユーザーを作成する手順に従うことをお勧めします。
要するに、IAM ユーザー認証を実践する場合、以下の AWS リソースに関する情報を収集する必要があります。
- データを保存する S3 バケット
- バケット内の特定のオブジェクトにアクセスする場合の S3 オブジェクトキー(オブジェクト名)。S3 オブジェクトがサブフォルダに保存されている場合、オブジェクトキーにはプレフィックスを含めることができます。
- S3 バケットが属する AWS リージョン
- アクセス資格情報として使用されるアクセスキーとシークレットキー
利用可能なすべての認証方法については、AWS リソースへの認証 を参照してください。
CelerData への接続
ロードジョブを開始する前に、CelerData クラスターに接続し、使用する catalog を指定する必要があります。クラスターがエラスティッククラスターの場合、使用するウェアハウスも指定する必要があります。指定したウェアハウスが稼働中であることを確認してください。
その後、S3 バケットからデータをロードするためのロードジョブを開始できます。
INSERT+FILES() の使用
このメソッドは現在、Parquet と ORC ファイル形式のみをサポートしています。
INSERT+FILES() の利点
FILES()
は、指定したパス関連のプロパ ティに基づいてクラウドストレージに保存されたファイルを読み取り、ファイル内のデータのテーブルスキーマを推測し、ファイルからデータをデータ行として返すことができます。FILES()
を使用すると、以下のことが可能です。
- SELECT を使用して S3 から直接データをクエリする
- INSERT を使用してテーブルを作成し、ロードする
- CREATE TABLE AS SELECT (CTAS) を使用して既存のテーブルにデータをロードする
典型的な例
FILES()
テーブル関数を使用した 3 つの例があります。
- SELECT を使用して S3 から直接データをクエリする
- CTAS を使用してテーブルを作成し、ロードする
- 手動でテーブルを作成し、INSERT を使用してデータをロードする
SELECT を使用して S3 から直接クエリする
SELECT+FILES()
を使用して S3 から直接クエリすることで、テーブルを作成する前にデータセットの内容をプレビュー できます。例えば:
- データを保存せずにデータセットをプレビューする
- 最小値と最大値をクエリし、使用するデータ型を決定する
NULL
値を確認する
以下の例は、サンプルデータセット s3://starrocks-examples/user_behavior_ten_million_rows.parquet
をクエリします。
SELECT * FROM FILES
(
"path" = "s3://starrocks-examples/user_behavior_ten_million_rows.parquet",
"format" = "parquet",
"aws.s3.region" = "us-east-1",
"aws.s3.access_key" = "AAAAAAAAAAAAAAAAAAAA",
"aws.s3.secret_key" = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
)
LIMIT 3;
NOTE
上記のコマンドで
AAA
とBBB
の部分をあなたの資格情報に置き換えてください。オブジェクトは AWS 認証済みユーザーであれば読み取り可能ですので、有効なaws.s3.access_key
とaws.s3.secret_key
を使用できます。
システムは以下のクエリ結果を返します。
+--------+---------+------------+--------------+---------------------+
| UserID | ItemID | CategoryID | BehaviorType | Timestamp |
+--------+---------+------------+--------------+---------------------+
| 543711 | 829192 | 2355072 | pv | 2017-11-27 08:22:37 |
| 543711 | 2056618 | 3645362 | pv | 2017-11-27 10:16:46 |
| 543711 | 1165492 | 3645362 | pv | 2017-11-27 10:17:00 |
+--------+---------+------------+--------------+---------------------+
NOTE
上記で返された列名は Parquet ファイルによって提供されています。
CTAS を使用してテーブルを作成し、ロードする
これは前の例の続きです。前のクエリは CREATE TABLE AS SELECT (CTAS) にラップされ、スキーマ推論を使用してテーブル作成を自動化します。 これは、CelerData がテーブルスキーマを推測し、希望するテーブルを作成し、その後データをテーブルにロードすることを意味します。Parquet ファイルを使用する場合、Parquet 形式には列名が含まれているため、FILES()
テーブル関数を使用する際にテーブルを作成するための列名と型は必要ありません。
データベースを作成し、切り替えます。
CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;
CTAS を使用してテーブルを作成し、サンプルデータセット s3://starrocks-examples/user_behavior_ten_million_rows.parquet
のデータをテーブルにロードします。
CREATE TABLE user_behavior_inferred AS
SELECT * FROM FILES
(
"path" = "s3://starrocks-examples/user_behavior_ten_million_rows.parquet",
"format" = "parquet",
"aws.s3.region" = "us-east-1",
"aws.s3.access_key" = "AAAAAAAAAAAAAAAAAAAA",
"aws.s3.secret_key" = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
);
NOTE
上記のコマンドで
AAA
とBBB
の部分をあなたの資格情報に置き換えてください。オブジェクトは AWS 認証済みユーザーであれば読み取り可能ですので、有効なaws.s3.access_key
とaws.s3.secret_key
を使用できます。
テーブルを作成した後、DESCRIBE を使用してそのスキーマを表示できます。
DESCRIBE user_behavior_inferred;
システムは以下のクエリ結果を返します。
+--------------+------------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-------+---------+-------+
| UserID | bigint | YES | true | NULL | |
| ItemID | bigint | YES | true | NULL | |
| CategoryID | bigint | YES | true | NULL | |
| BehaviorType | varchar(1048576) | YES | false | NULL | |
| Timestamp | varchar(1048576) | YES | false | NULL | |
+--------------+------------------+------+-------+---------+-------+
推測されたスキーマと手動で作成されたスキーマを比較します。
- データ型
- NULL 許可
- キーフィールド
宛先テーブルのスキーマをより良く制御し、クエリパフォーマンスを向上させるために、本番環境では手動でテーブルスキーマを指定することをお勧めします。
テーブルをクエリして、データがロードされたことを確認します。例:
SELECT * from user_behavior_inferred LIMIT 3;
以下のクエリ結果が返され、データが正常にロードされたことを示します。
+--------+--------+------------+--------------+---------------------+
| UserID | ItemID | CategoryID | BehaviorType | Timestamp |
+--------+--------+------------+--------------+---------------------+
| 58 | 158350 | 2355072 | pv | 2017-11-27 13:06:51 |
| 58 | 158590 | 3194735 | pv | 2017-11-27 02:21:04 |
| 58 | 215073 | 3002561 | pv | 2017-11-30 10:55:42 |
+--------+--------+------------+--------------+---------------------+
INSERT を使用して既存のテーブルにロードする
挿入するテーブルをカスタマイズしたい場合があります。例えば:
- 列のデータ型、NULL 許可設定、またはデフォルト値
- キーの種類と列
- データのパーティショニングとバケッティング
NOTE
最も効率的なテーブル構造を作成するには、データの使用方法と列の内容に関する知識が必要です。このトピックではテーブル設計をカバーしていません。テーブル設計については、テーブルタイプ を参照してください。
この例では、テーブルがどのようにクエリされるか、Parquet ファイル内のデータに関する知識に基づいてテーブルを作成しています。Parquet ファイル内のデータに関する知識は、S3 でファイルを直接クエリすることで得られます。
- S3 のデータセットをクエリすると、
Timestamp
列がdatetime
データ型に一致するデータを含んでいることが示されるため、以下の DDL で列型が指定されています。 - S3 のデータをクエリすることで、データセットに
NULL
値がないことがわかるため、DDL ではどの列も NULL 許可として設定されていません。 - 予想されるクエリタイプに基づいて、ソートキーとバケッティング列は
UserID
列に設定されています。このデータに対するユースケースが異なる場合は、ソートキーとしてItemID
を使用することも考えられます。
データベースを作成し、切り替えます。
CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;
手動でテーブルを作成します(AWS S3 からロードする Parquet ファイルと同じスキーマを持つことをお勧めします)。
CREATE TABLE user_behavior_declared
(
UserID int(11),
ItemID int(11),
CategoryID int(11),
BehaviorType varchar(65533),
Timestamp datetime
);
テーブルを作成した後、INSERT INTO
… SELECT FROM FILES()
を使用してロードできます。
INSERT INTO user_behavior_declared
SELECT * FROM FILES
(
"path" = "s3://starrocks-examples/user_behavior_ten_million_rows.parquet",
"format" = "parquet",
"aws.s3.region" = "us-east-1",
"aws.s3.access_key" = "AAAAAAAAAAAAAAAAAAAA",
"aws.s3.secret_key" = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
);
NOTE
上記のコマンドで
AAA
とBBB
の部分をあなたの資格情報に置き換えてください。オブジェクトは AWS 認証済みユーザーであれば読み取り可能ですので、有効なaws.s3.access_key
とaws.s3.secret_key
を使用できます。
ロードが完了した後、テーブルをクエリしてデータがロードされたことを確認します。例:
SELECT * from user_behavior_declared LIMIT 3;
以下のクエリ結果が返され、データが正常にロードされたことを示します。
+--------+---------+------------+--------------+---------------------+
| UserID | ItemID | CategoryID | BehaviorType | Timestamp |
+--------+---------+------------+--------------+---------------------+
| 58 | 4309692 | 1165503 | pv | 2017-11-25 14:06:52 |
| 58 | 181489 | 1165503 | pv | 2017-11-25 14:07:22 |
| 58 | 3722956 | 1165503 | pv | 2017-11-25 14:09:28 |
+--------+---------+------------+--------------+---------------------+