# INSERT INTO
テーブルにデータを挿入します。
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
(c1, c2, c3) を使用して挿入する列のリストを指定できます。
例えば、以下のテーブルを考えます。
SHOW CREATE insert_table;
CREATE TABLE insert_table
(
`a` Int8,
`b` String,
`c` Int8
)
ENGINE = MergeTree()
ORDER BY a
INSERT INTO insert_table (*) VALUES (1, 'a', 1) ;
# SELECT の結果を挿入する
SELECT 文の結果を INSERT INTO 文の値として使用するには、次の文を使用します。
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
列は SELECT 句内の位置に基づいてマッピングされます。ただし、SELECT 式と INSERT のテーブルの名前は異なる場合があります。必要に応じて型変換が行われます。
例えば、以下のデータを持つ data テーブルを考えます。
SELECT * FROM data
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
└───┴───┴───┘
┌─a─┬─b─┬─c─┐
│ 2 │ a │ 3 │
└───┴───┴───┘
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 2 │
└───┴───┴───┘
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 3 │
└───┴───┴───┘
data テーブルのデータを insert_table テーブルに挿入します。
INSERT INTO insert_table (*) SELECT
a,
b,
c
FROM data
現在の insert_table テーブルのデータを表示します。
SELECT *
FROM insert_table
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
└───┴───┴───┘
# INSERT INTO で s3 テーブル関数を使用する
MyScale は s3 テーブル関数 (opens new window) をサポートしています。s3 テーブル関数を使用して、Amazon S3 と互換性のあるストレージサービスからデータをインポート/エクスポートすることができます。
構文
s3(path [, NOSIGN | aws_access_key_id, aws_secret_access_key] [,format] [,structure] [,compression])
引数
path- ファイルへのバケット URL とパス。次のワイルドカードを読み取り専用モードでサポートしています:*,?,{abc,def}および{N..M}。詳細についてはこちら (opens new window)を参照してください。NOSIGN- 認証情報の代わりにこのキーワードを指定すると、すべてのリクエストは署名されません。format- ファイルのフォーマット (opens new window)。structure- テーブルの構造。形式は'column1_name column1_type, column2_name column2_type, ...'です。compression- パラメータはオプションです。サポートされる値:none,gzip/gz,brotli/br,xz/LZMA,zstd/zst。デフォルトでは、ファイルの拡張子によって圧縮形式が自動検出されます。
戻り値
指定された構造のテーブルで、指定されたファイルにデータを読み書きするためのテーブル。
# S3 ファイルからデータを挿入する
以下は、s3 テーブル関数を使用して S3 からデータをインポートする例です。
データを格納するためのテーブルを作成します。
CREATE TABLE default.myscale_categorical_search
(
id UInt32,
data Array(Float32),
CONSTRAINT check_length CHECK length(data) = 128,
date Date,
label Enum8('person' = 1, 'building' = 2, 'animal' = 3)
) ENGINE = MergeTree ORDER BY id
S3 ファイル https://d3lhz231q7ogjd.cloudfront.net/sample-datasets/quick-start/categorical-search.csv (opens new window) からデータを挿入します。
INSERT INTO default.myscale_categorical_search
SELECT * FROM s3(
'https://d3lhz231q7ogjd.cloudfront.net/sample-datasets/quick-start/categorical-search.csv',
'CSVWithNames',
'id UInt32, data Array(Float32), date Date, label Enum8(''person'' = 1, ''building'' = 2, ''animal'' = 3)'
)
# Insert Into を使用してデータを S3 にエクスポートする
s3 テーブル関数を使用して、MyScale から S3 にデータをエクスポートすることもできます。
INSERT INTO FUNCTION s3(
'https://your-s3-bucket.s3.amazonaws.com/categorical-search.parquet',
'AWS_ACCESS_KEY_ID',
'AWS_SECRET_ACCESS_KEY',
'Parquet')
SELECT * FROM default.myscale_categorical_search LIMIT 1000
上記の例では、https://your-s3-bucket.s3.amazonaws.com/categorical-search.csv はデータが書き込まれる S3 ストレージバケット内のパスを指定しています。AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY パラメータは、S3 ストレージバケットにアクセスするために必要な AWS アクセスキーとシークレットキーを指定しています。Parquet パラメータは、データが Parquet 形式で S3 ストレージバケットに書き込まれ、default.myscale_categorical_search テーブルの最初の 1000 行のすべてのフィールドの内容が含まれることを示しています。
エクスポートするデータが多すぎる場合、MyScale で利用可能なさまざまなパーティショニングオプションを使用してデータを分割してエクスポートすることができます。次の例では、rand() 関数のモジュラスを使用して、10 個のファイルを作成します。結果のパーティション ID はファイル名で参照されます。これにより、categorical-search_0.parquet、categorical-search_1.parquet などの数値のサフィックスが付いた 10 個のファイルが作成されます。
INSERT INTO FUNCTION s3(
'https://your-s3-bucket.s3.amazonaws.com/categorical-search_{_partition_id}.parquet',
'AWS_ACCESS_KEY_ID',
'AWS_SECRET_ACCESS_KEY',
'Parquet')
PARTITION BY rand() % 10
SELECT * FROM default.myscale_categorical_search