# 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_IDAWS_SECRET_ACCESS_KEY パラメータは、S3 ストレージバケットにアクセスするために必要な AWS アクセスキーとシークレットキーを指定しています。Parquet パラメータは、データが Parquet 形式で S3 ストレージバケットに書き込まれ、default.myscale_categorical_search テーブルの最初の 1000 行のすべてのフィールドの内容が含まれることを示しています。

エクスポートするデータが多すぎる場合、MyScale で利用可能なさまざまなパーティショニングオプションを使用してデータを分割してエクスポートすることができます。次の例では、rand() 関数のモジュラスを使用して、10 個のファイルを作成します。結果のパーティション ID はファイル名で参照されます。これにより、categorical-search_0.parquetcategorical-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