INSERTを使用したデータロード
このトピックでは、SQLステートメント - INSERT を使用してStarRocksにデータをロードする方法について説明します。
MySQLや他の多くのデータベース管理システムと同様に、StarRocksはINSERTを使用して内部テーブルにデータをロードすることをサポートしています。VALUES句を使用して1行または複数行を直接挿入し、関数やデモをテストすることができます。また、外部テーブルからクエリの結果として定義されたデータを内部テーブルに挿入することもできます。StarRocks v3.1以降では、INSERTコマンドとテーブル関数 FILES() を使用して、クラウドストレージ上のファイルから直接データをロードできます。
StarRocks v2.4では、INSERT OVERWRITEを使用してテーブルにデータを上書きすることもサポートしています。INSERT OVERWRITEステートメントは、上書き機能を実現するために以下の操作を統合しています:
- 元のデータを格納するパーティションに基づいて一時パーティションを作成します。
- 一時パーティションにデータを挿入します。
- 元のパーティションと一時パーティションを入れ替えます。
注意
データを上書きする前に検証が必要な場合は、INSERT OVERWRITEを使用する代わりに、上記の手順に従ってデータを上書きし、パーティションを入れ替える前に検証することができます。
注意事項
- 同期INSERTトランザクションをキャンセルするには、MySQLクライアントからCtrlとCキーを押す必要があります。
- 非同期INSERTタスクをSUBMIT TASKを使用して送信できます。
- 現在のStarRocksのバージョンでは、テーブルのスキーマに準拠していない行のデータがある場合、INSERTトランザクションはデフォルトで失敗します。例えば、テーブル内のマッピングフィールドの長さ制限を超えるフィールドがある場合、INSERTトランザクションは失敗します。セッション変数
enable_insert_strict
をfalse
に設定することで、テーブルと一致しない行をフィルタリングしてトランザクションを続行することができます。 - 小さなデータバッチをStarRocksに頻繁にINSERTステートメントでロードすると、過剰なデータバージョンが生成されます。これによりクエリパフォーマンスが大きく影響を受けます。生産環境では、INSERTコマンドを頻繁に使用してデータをロードしたり、日常的なデータロードのルーチンとして使用したりしないことをお勧めします。アプリケーションや分析シナリオがストリーミングデータや小さなデータバッチのロードを別々に求める場合、Apache Kafka®をデータソースとして使用し、Routine Loadを介してデータをロードすることをお勧めします。
- INSERT OVERWRITEステートメントを実行すると、StarRocksは元のデータを格納するパーティションに対して一時パーティションを作成し、新しいデータを一時パーティションに挿入し、元のパーティションと一時パーティションを入れ替えます。これらの操作はすべてFE Leaderノードで実行されます。したがって、INSERT OVERWRITEコマンドを実行中にFE Leaderノードがクラッシュすると、ロードトランザクション全体が失敗し、一時パーティションは切り捨てられます。
準備
権限を確認する
StarRocks テーブルにデータを ロード するには、その StarRocks テーブルに対して INSERT 権限を持つユーザーである必要があります。INSERT 権限を持っていない場合は、 GRANT に記載されている手順に従って、StarRocks クラスターに接続するために使用するユーザーに INSERT 権限を付与してください。構文は GRANT INSERT ON TABLE <table_name> IN DATABASE <database_name> TO { ROLE <role_name> | USER <user_identity>}
です。
オブジェクトを作成する
load_test
という名前のデータベースを作成し、宛先テーブルとしてinsert_wiki_edit
テーブルを、ソーステーブルとしてsource_wiki_edit
テーブルを作成します。
注意
このトピックで示されている例は、
insert_wiki_edit
テーブルとsource_wiki_edit
テーブルに基づいています。独自のテーブルとデータで作業することを希望する場合は、準備をスキップして次のステップに進むことができます。
CREATE DATABASE IF NOT EXISTS load_test;
USE load_test;
CREATE TABLE insert_wiki_edit
(
event_time DATETIME,
channel VARCHAR(32) DEFAULT '',
user VARCHAR(128) DEFAULT '',
is_anonymous TINYINT DEFAULT '0',
is_minor TINYINT DEFAULT '0',
is_new TINYINT DEFAULT '0',
is_robot TINYINT DEFAULT '0',
is_unpatrolled TINYINT DEFAULT '0',
delta INT DEFAULT '0',
added INT DEFAULT '0',
deleted INT DEFAULT '0'
)
DUPLICATE KEY(
event_time,
channel,
user,
is_anonymous,
is_minor,
is_new,
is_robot,
is_unpatrolled
)
PARTITION BY RANGE(event_time)(
PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'),
PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'),
PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'),
PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00')
)
DISTRIBUTED BY HASH(user);
CREATE TABLE source_wiki_edit
(
event_time DATETIME,
channel VARCHAR(32) DEFAULT '',
user VARCHAR(128) DEFAULT '',
is_anonymous TINYINT DEFAULT '0',
is_minor TINYINT DEFAULT '0',
is_new TINYINT DEFAULT '0',
is_robot TINYINT DEFAULT '0',
is_unpatrolled TINYINT DEFAULT '0',
delta INT DEFAULT '0',
added INT DEFAULT '0',
deleted INT DEFAULT '0'
)
DUPLICATE KEY(
event_time,
channel,user,
is_anonymous,
is_minor,
is_new,
is_robot,
is_unpatrolled
)
PARTITION BY RANGE(event_time)(
PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'),
PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'),
PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'),
PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00')
)
DISTRIBUTED BY HASH(user);
注意
v2.5.7以降、StarRocksはテーブルを作成する際やパーティションを追加する際にバケット数(BUCKETS)を自動的に設定できます。バケット数を手動で設定する必要はありません。詳細については、バケット数の設定を参照し てください。
INSERT INTO VALUESを使用したデータ挿入
INSERT INTO VALUESコマンドを使用して、特定のテーブルに1行または複数行を追加できます。複数行はカンマ(,)で区切られます。詳細な手順とパラメータの参照については、SQLリファレンス - INSERTを参照してください。
注意
INSERT INTO VALUESを使用したデータ挿入は、小さなデータセットでデモを検証する場合にのみ適用されます。大規模なテストや本番環境には推奨されません。StarRocksに大量のデータをロードするには、ロードオプションを参照し、シナリオに適した他のオプションを検討してください。
以下の例では、source_wiki_edit
データソーステーブルにinsert_load_wikipedia
ラベルを付けて2行を挿入します。ラベルは、データベース内の各データロードトランザクションの一意の識別ラベルです。
INSERT INTO source_wiki_edit
WITH LABEL insert_load_wikipedia
VALUES
("2015-09-12 00:00:00","#en.wikipedia","AustinFF",0,0,0,0,0,21,5,0),
("2015-09-12 00:00:00","#ca.wikipedia","helloSR",0,1,0,1,0,3,23,0);
INSERT INTO SELECTを使用したデータ挿入
データソーステーブルのクエリ結果をターゲットテーブルにロードするには、INSERT INTO SELECTコマンドを使用します。INSERT INTO SELECTコマンドは、データソーステーブルからのデータに対してETL操作を行い、StarRocksの内部テーブルにデータをロードします。データソースは、1つ以上の内部または外部テーブル、またはクラウドストレージ上のデータファイルである可能性があります。ターゲットテーブルはStarRocksの内部テーブルでなければなりません。詳細な手順とパラメータの参照については、SQLリファレンス - INSERTを参照してください。