COPY INTO <location>
COPY INTO を使用すると、テーブルまたはクエリからデータを、以下のいずれかの場所にある 1 つ以上のファイルへアンロードできます。
- ユーザー / 内部 / 外部 stage: TiDB Cloud Lake の stage については、Stage とは? を参照してください。
- ストレージサービスで作成されたバケットまたはコンテナ。
関連情報: COPY INTO <table>
構文
COPY INTO { internalStage | externalStage | externalLocation }
FROM { [<database_name>.]<table_name> | ( <query> ) }
[ PARTITION BY ( <expr> ) ]
[ FILE_FORMAT = (
FORMAT_NAME = '<your-custom-format>'
| TYPE = { CSV | TSV | NDJSON | PARQUET | LANCE } [ formatTypeOptions ]
) ]
[ copyOptions ]
[ VALIDATION_MODE = RETURN_ROWS ]
[ DETAILED_OUTPUT = true | false ]
internalStage
internalStage ::= @<internal_stage_name>[/<path>]
externalStage
externalStage ::= @<external_stage_name>[/<path>]
externalLocation
externalLocation ::=
's3://<bucket>[<path>]'
CONNECTION = (
<connection_parameters>
)
Amazon S3 互換ストレージサービスへのアクセスに使用できる接続パラメータについては、接続パラメータ を参照してください。
externalLocation ::=
'azblob://<container>[<path>]'
CONNECTION = (
<connection_parameters>
)
Azure Blob Storage へのアクセスに使用できる接続パラメータについては、接続パラメータ を参照してください。
externalLocation ::=
'gcs://<bucket>[<path>]'
CONNECTION = (
<connection_parameters>
)
Google Cloud Storage へのアクセスに使用できる接続パラメータについては、接続パラメータ を参照してください。
externalLocation ::=
'oss://<bucket>[<path>]'
CONNECTION = (
<connection_parameters>
)
Alibaba Cloud OSS へのアクセスに使用できる接続パラメータについては、接続パラメータ を参照してください。
externalLocation ::=
'cos://<bucket>[<path>]'
CONNECTION = (
<connection_parameters>
)
Tencent Cloud Object Storage へのアクセスに使用できる接続パラメータについては、接続パラメータ を参照してください。
FILE_FORMAT
詳細は 入出力ファイル形式 を参照してください。
LANCE は COPY INTO <location> でのみサポートされます。TiDB Cloud Lake は、単一のファイルではなく、対象パス配下に Lance データセットディレクトリを書き込みます。
PARTITION BY
アンロードされたデータを個別のフォルダに分割するために使用する式を指定します。この式は STRING 型として評価される必要があります。式によって生成される値ごとに、宛先パスの下にサブフォルダが作成され、対応する行はそのサブフォルダ配下のファイルに書き込まれます。
- 式が
NULLと評価された場合、行は特別な_NULL_フォルダに配置されます。 - この式では、ソーステーブルまたはクエリの任意のカラムを参照できます。
- パーティション値でのパストラバーサル (
..) は許可されません。
以下のオプションは PARTITION BY と互換性がなく、設定するとエラーになります。
copyOptions
copyOptions ::=
[ SINGLE = true | false ]
[ MAX_FILE_SIZE = <num> ]
[ OVERWRITE = true | false ]
[ INCLUDE_QUERY_ID = true | false ]
[ USE_RAW_PATH = true | false ]
DETAILED_OUTPUT
データのアンロード結果の詳細を返すかどうかを決定します。デフォルト値は false です。詳細については、出力 を参照してください。
出力
COPY INTO は、データのアンロード結果の要約を以下のカラムで提供します。
DETAILED_OUTPUT を true に設定すると、COPY INTO は以下のカラムを含む結果を返します。これは、特に MAX_FILE_SIZE を使用してアンロードされたデータを複数ファイルに分割する場合に、アンロードされたファイルの場所を特定するのに役立ちます。
例
このセクションでは、以下のテーブルとデータを使用して例を示します。
-- Create sample table
CREATE TABLE canadian_city_population (
city_name VARCHAR(50),
population INT
);
-- Insert sample data
INSERT INTO canadian_city_population (city_name, population)
VALUES
('Toronto', 2731571),
('Montreal', 1704694),
('Vancouver', 631486),
('Calgary', 1237656),
('Ottawa', 934243),
('Edmonton', 972223),
('Quebec City', 542298),
('Winnipeg', 705244),
('Hamilton', 536917),
('Halifax', 403390);
例 1: 内部 stage へのアンロード (unload)
この例では、データを内部 stage にアンロードします。
-- Create an internal stage
CREATE STAGE my_internal_stage;
-- Unload data from the table to the stage using the PARQUET file format
COPY INTO @my_internal_stage
FROM canadian_city_population
FILE_FORMAT = (TYPE = PARQUET);
┌────────────────────────────────────────────┐
│ rows_unloaded │ input_bytes │ output_bytes │
├───────────────┼─────────────┼──────────────┤
│ 10 │ 211 │ 572 │
└────────────────────────────────────────────┘
LIST @my_internal_stage;
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ size │ md5 │ last_modified │ creator │
├─────────────────────────────────────────────────────────────────┼────────┼──────────────────┼───────────────────────────────┼──────────────────┤
│ data_abe520a3-ee88-488c-9221-b07c562c9a30_0000_00000000.parquet │ 572 │ NULL │ 2024-01-18 16:20:48.979 +0000 │ NULL │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
例 2: 圧縮ファイルへのアンロード (unload)
この例では、データを圧縮ファイルにアンロードします。
-- Create an internal stage
CREATE STAGE my_internal_stage;
-- Unload data from the table to the stage using the CSV file format with gzip compression
COPY INTO @my_internal_stage
FROM canadian_city_population
FILE_FORMAT = (TYPE = CSV COMPRESSION = gzip);
┌────────────────────────────────────────────┐
│ rows_unloaded │ input_bytes │ output_bytes │
├───────────────┼─────────────┼──────────────┤
│ 10 │ 182 │ 168 │
└────────────────────────────────────────────┘
LIST @my_internal_stage;
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ size │ md5 │ last_modified │ creator │
├────────────────────────────────────────────────────────────────┼────────┼──────────────────┼───────────────────────────────┼──────────────────┤
│ data_7970afa5-32e3-4e7d-b793-e42a2a82a8e6_0000_00000000.csv.gz │ 168 │ NULL │ 2024-01-18 16:27:01.663 +0000 │ NULL │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
-- COPY INTO also works with custom file formats. See below:
-- Create a custom file format named my_csv_gzip with CSV format and gzip compression
CREATE FILE FORMAT my_csv_gzip TYPE = CSV COMPRESSION = gzip;
-- Unload data from the table to the stage using the custom file format my_csv_gzip
COPY INTO @my_internal_stage
FROM canadian_city_population
FILE_FORMAT = (FORMAT_NAME = 'my_csv_gzip');
┌────────────────────────────────────────────┐
│ rows_unloaded │ input_bytes │ output_bytes │
├───────────────┼─────────────┼──────────────┤
│ 10 │ 182 │ 168 │
└────────────────────────────────────────────┘
LIST @my_internal_stage;
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ size │ md5 │ last_modified │ creator │
├────────────────────────────────────────────────────────────────┼────────┼──────────────────┼───────────────────────────────┼──────────────────┤
│ data_d006ba1c-0609-46d7-a67b-75c7078d86ff_0000_00000000.csv.gz │ 168 │ NULL │ 2024-01-18 16:29:29.721 +0000 │ NULL │
│ data_7970afa5-32e3-4e7d-b793-e42a2a82a8e6_0000_00000000.csv.gz │ 168 │ NULL │ 2024-01-18 16:27:01.663 +0000 │ NULL │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
例 3: バケットへのアンロード (unload)
この例では、データを MinIO 上のバケットにアンロードします。
-- Unload data from the table to a bucket named 'lake' on MinIO using the PARQUET file format
COPY INTO 's3://lake'
CONNECTION = (
ENDPOINT_URL = 'http://localhost:9000/',
ACCESS_KEY_ID = 'ROOTUSER',
SECRET_ACCESS_KEY = 'CHANGEME123',
region = 'us-west-2'
)
FROM canadian_city_population
FILE_FORMAT = (TYPE = PARQUET);
┌────────────────────────────────────────────┐
│ rows_unloaded │ input_bytes │ output_bytes │
├───────────────┼─────────────┼──────────────┤
│ 10 │ 211 │ 572 │
└────────────────────────────────────────────┘
例 4: PARTITION BY を使用したアンロード (unload)
この例では、導出式に基づいてデータをパーティション化されたフォルダにアンロードします。
-- Create a sample table
CREATE TABLE sales_data (
sale_date DATE,
region VARCHAR,
amount INT
);
INSERT INTO sales_data VALUES
('2025-01-15', 'east', 100),
('2025-01-20', 'west', 200),
('2025-02-10', 'east', 150),
(NULL, 'west', 50);
-- Create an internal stage
CREATE STAGE partitioned_stage;
-- Unload data partitioned by year-month derived from sale_date
-- When sale_date is NULL, to_varchar() returns NULL, so the entire
-- concatenation evaluates to NULL and the row lands in the _NULL_ folder.
COPY INTO @partitioned_stage
FROM sales_data
PARTITION BY ('month=' || to_varchar(sale_date, 'YYYY-MM'))
FILE_FORMAT = (TYPE = PARQUET);
-- Verify the partitioned folder layout
SELECT name FROM list_stage(location => '@partitioned_stage') ORDER BY name;
┌──────────────────────────────────────────────────────────────────┐
│ name │
├──────────────────────────────────────────────────────────────────┤
│ _NULL_/data_<query_id>_0000_00000000.parquet │
│ month=2025-01/data_<query_id>_0000_00000000.parquet │
│ month=2025-02/data_<query_id>_0000_00000000.parquet │
└──────────────────────────────────────────────────────────────────┘
パーティション式の評価結果が NULL の場合、データは _NULL_ フォルダに配置されます。各一意のパーティション値ごとに、それぞれ対応するデータファイルを含む独自のサブフォルダが作成されます。
例 5: Lance データセットへのアンロード (unload)
この例では、データを単独のファイルではなく、Lance データセットディレクトリとしてアンロードします。
CREATE STAGE ml_stage;
COPY INTO @ml_stage/datasets/train
FROM (
SELECT number, number + 1 AS label
FROM numbers(10)
)
FILE_FORMAT = (TYPE = LANCE)
USE_RAW_PATH = TRUE
OVERWRITE = TRUE
DETAILED_OUTPUT = TRUE;
出力パスには、次のようなエントリを含む Lance データセットのレイアウトが作成されます。
datasets/train/_versions/...
datasets/train/data/... .lance
datasets/train/*.manifest
Python の lance を使用した検証を含む、完全なエンドツーエンドの例については、Lance データセットのアンロード を参照してください。