# 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