📣新登場!TiDB Cloud BYOC、TiDB Cloud Filesystem、PostgreSQL-compatible TiDB Cloud Starter がパブリックプレビュー中。このページは自動翻訳されたものです。原文はこちらからご覧ください。

COPY INTO <table>



COPY INTO を使用すると、以下のいずれかの場所にあるファイルからデータをロード (load) できます。

  • ユーザー / 内部 / 外部 stage: TiDB Cloud Lake の stage については、Stage とは? を参照してください。
  • ストレージサービスで作成されたバケットまたはコンテナ。
  • URL(https:// で始まる)でファイルにアクセスできるリモートサーバー。
  • IPFS および Hugging Face リポジトリ。

関連情報: COPY INTO <location>

構文

/* Standard data load */ COPY INTO [<database_name>.]<table_name> [ ( <col_name> [ , <col_name> ... ] ) ] FROM { userStage | internalStage | externalStage | externalLocation } [ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ] [ PATTERN = '<regex_pattern>' ] [ FILE_FORMAT = ( FORMAT_NAME = '<your-custom-format>' | TYPE = { CSV | TSV | NDJSON | PARQUET | ORC | AVRO } [ formatTypeOptions ] ) ] [ copyOptions ] /* Data load with transformation */ COPY INTO [<database_name>.]<table_name> [ ( <col_name> [ , <col_name> ... ] ) ] FROM ( SELECT { [<alias>.]<column> [, [<alias>.]<column> ...] -- Query columns by name | [<alias>.]$<col_position> [, [<alias>.]$<col_position> ...] -- Query columns by position | [<alias>.]$1[:<column>] [, [<alias>.]$1[:<column>] ...] -- Query rows as Variants } ] FROM {@<stage_name>[/<path>] | '<uri>'} ) [ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ] [ PATTERN = '<regex_pattern>' ] [ FILE_FORMAT = ( FORMAT_NAME = '<your-custom-format>' | TYPE = { CSV | TSV | NDJSON | PARQUET | ORC | AVRO } [ formatTypeOptions ] ) ] [ copyOptions ]

以下のとおりです。

userStage ::= @~[/<path>] internalStage ::= @<internal_stage_name>[/<path>] externalStage ::= @<external_stage_name>[/<path>] externalLocation ::= /* Amazon S3-like Storage */ 's3://<bucket>[/<path>]' CONNECTION = ( [ CONNECTION_NAME = '<connection-name>' ] | [ ENDPOINT_URL = '<endpoint-url>' ] [ ACCESS_KEY_ID = '<your-access-key-ID>' ] [ SECRET_ACCESS_KEY = '<your-secret-access-key>' ] [ ENABLE_VIRTUAL_HOST_STYLE = TRUE | FALSE ] [ MASTER_KEY = '<your-master-key>' ] [ REGION = '<region>' ] [ SECURITY_TOKEN = '<security-token>' ] [ ROLE_ARN = '<role-arn>' ] [ EXTERNAL_ID = '<external-id>' ] ) /* Azure Blob Storage */ | 'azblob://<container>[/<path>]' CONNECTION = ( [ CONNECTION_NAME = '<connection-name>' ] | ENDPOINT_URL = '<endpoint-url>' ACCOUNT_NAME = '<account-name>' ACCOUNT_KEY = '<account-key>' ) /* Google Cloud Storage */ | 'gcs://<bucket>[/<path>]' CONNECTION = ( [ CONNECTION_NAME = '<connection-name>' ] | CREDENTIAL = '<your-base64-encoded-credential>' ) /* Alibaba Cloud OSS */ | 'oss://<bucket>[/<path>]' CONNECTION = ( [ CONNECTION_NAME = '<connection-name>' ] | ACCESS_KEY_ID = '<your-ak>' ACCESS_KEY_SECRET = '<your-sk>' ENDPOINT_URL = '<endpoint-url>' [ PRESIGN_ENDPOINT_URL = '<presign-endpoint-url>' ] ) /* Tencent Cloud Object Storage */ | 'cos://<bucket>[/<path>]' CONNECTION = ( [ CONNECTION_NAME = '<connection-name>' ] | SECRET_ID = '<your-secret-id>' SECRET_KEY = '<your-secret-key>' ENDPOINT_URL = '<endpoint-url>' ) /* Remote Files */ | 'https://<url>' /* IPFS */ | 'ipfs://<your-ipfs-hash>' CONNECTION = (ENDPOINT_URL = 'https://<your-ipfs-gateway>') /* Hugging Face */ | 'hf://<repo-id>[/<path>]' CONNECTION = ( [ REPO_TYPE = 'dataset' | 'model' ] [ REVISION = '<revision>' ] [ TOKEN = '<your-api-token>' ] ) formatTypeOptions ::= /* Common options for all formats */ [ COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | XZ | NONE ] /* CSV specific options */ [ RECORD_DELIMITER = '<character>' ] [ FIELD_DELIMITER = '<character>' ] [ SKIP_HEADER = <integer> ] [ QUOTE = '<character>' ] [ ESCAPE = '<character>' ] [ NAN_DISPLAY = '<string>' ] [ NULL_DISPLAY = '<string>' ] [ ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE | FALSE ] [ EMPTY_FIELD_AS = null | string | field_default ] [ BINARY_FORMAT = HEX | BASE64 ] [ TRIM_SPACE = TRUE | FALSE ] [ ENCODING = '<encoding_label>' ] [ ENCODING_ERROR_MODE = STRICT | REPLACE ] /* TSV specific options */ [ RECORD_DELIMITER = '<character>' ] [ FIELD_DELIMITER = '<character>' ] [ TRIM_SPACE = TRUE | FALSE ] [ ENCODING = '<encoding_label>' ] [ ENCODING_ERROR_MODE = STRICT | REPLACE ] /* NDJSON specific options */ [ NULL_FIELD_AS = NULL | FIELD_DEFAULT ] [ MISSING_FIELD_AS = ERROR | NULL | FIELD_DEFAULT ] [ NULL_IF = ('value1', 'value2', ...) ] /* PARQUET specific options */ [ MISSING_FIELD_AS = ERROR | FIELD_DEFAULT ] [ NULL_IF = ('value1', 'value2', ...) ] [ USE_LOGIC_TYPE = TRUE | FALSE ] /* ORC specific options */ [ MISSING_FIELD_AS = ERROR | FIELD_DEFAULT ] /* AVRO specific options */ [ MISSING_FIELD_AS = ERROR | FIELD_DEFAULT ] [ NULL_IF = ('value1', 'value2', ...) ] [ USE_LOGIC_TYPE = TRUE | FALSE ] copyOptions ::= [ PURGE = <bool> ] [ FORCE = <bool> ] [ DISABLE_VARIANT_CHECK = <bool> ] [ ON_ERROR = { continue | abort | abort_N } ] [ MAX_FILES = <num> ] [ RETURN_FAILED_ONLY = <bool> ] [ COLUMN_MATCH_MODE = { case-sensitive | case-insensitive } ] [ SCHEMA_EVOLUTION = ( [ SAMPLE_FILES = AUTO | <positive_integer> ] [ , SAMPLE_RECORDS_PER_FILE = AUTO | <positive_integer> ] [ , SAMPLE_TOTAL_RECORDS = AUTO | <positive_integer> ] ) ]

主なパラメータ

フォーマットタイプのオプション

FILE_FORMAT パラメータはさまざまなファイルタイプをサポートしており、それぞれに固有のフォーマットオプションがあります。以下に、サポートされている各ファイル形式で使用可能なオプションを示します。すべてのオプションの詳細については、入出力ファイル形式 を参照してください。

    これらのオプションは、すべてのファイル形式で使用できます。

    オプション説明値デフォルト
    COMPRESSIONデータファイルの圧縮アルゴリズムAUTO, GZIP, BZ2, BROTLI, ZSTD, DEFLATE, RAW_DEFLATE, XZ, NONEAUTO
    オプション説明デフォルト
    RECORD_DELIMITERレコードを区切る文字newline
    FIELD_DELIMITERフィールドを区切る文字comma (,)
    SKIP_HEADERスキップするヘッダー行数0
    QUOTEフィールドを囲むために使用する文字double-quote (")
    ESCAPE囲まれたフィールドのエスケープ文字NONE
    NAN_DISPLAYNaN 値を表す文字列NaN
    NULL_DISPLAYNULL 値を表す文字列\N
    ERROR_ON_COLUMN_COUNT_MISMATCHカラム数が一致しない場合にエラーにするTRUE
    EMPTY_FIELD_AS空フィールドの処理方法null
    BINARY_FORMATバイナリデータのエンコード形式 (HEX または BASE64)HEX
    TRIM_SPACEフィールドの先頭および末尾の ASCII 空白を削除するFALSE
    ENCODINGソースファイルの文字セットエンコーディングUTF-8
    ENCODING_ERROR_MODE無効なバイトの処理方法: STRICT または REPLACESTRICT
    オプション説明デフォルト
    RECORD_DELIMITERレコードを区切る文字newline
    FIELD_DELIMITERフィールドを区切る文字tab (\t)
    SKIP_HEADERスキップするヘッダー行数0
    TRIM_SPACEフィールドの先頭および末尾の ASCII 空白を削除するFALSE
    NAN_DISPLAYNaN 値を表す文字列NaN
    NULL_DISPLAYNULL 値を表す文字列\N
    EMPTY_FIELD_AS空フィールドの処理方法FIELD_DEFAULT
    ERROR_ON_COLUMN_COUNT_MISMATCHカラム数が一致しない場合にエラーにするTRUE
    ENCODINGソースファイルの文字セットエンコーディングUTF-8
    ENCODING_ERROR_MODE無効なバイトの処理方法: STRICT または REPLACESTRICT
    オプション説明デフォルト
    NULL_FIELD_ASnull フィールドの処理方法NULL
    MISSING_FIELD_AS欠落しているフィールドの処理方法ERROR
    NULL_IFNULL として扱う文字列のリストempty
    オプション説明デフォルト
    MISSING_FIELD_AS欠落しているフィールドの処理方法ERROR
    NULL_IFNULL として扱う文字列のリストempty
    USE_LOGIC_TYPEカラム型推論に Parquet の論理型を使用するTRUE
    オプション説明デフォルト
    MISSING_FIELD_AS欠落しているフィールドの処理方法ERROR
    オプション説明デフォルト
    MISSING_FIELD_AS欠落しているフィールドの処理方法ERROR
    NULL_IFNULL として扱う文字列のリストempty
    USE_LOGIC_TYPEカラム型推論に Avro の論理型を使用するTRUE

    コピーオプション

    パラメータ説明デフォルト
    PURGEロード成功後にファイルを削除するfalse
    FORCE重複ファイルの再ロードを許可するfalse (重複をスキップ)
    DISABLE_VARIANT_CHECK無効な JSON を null に置き換えるfalse (無効な JSON では失敗)
    ON_ERRORエラーの処理方法: continue、abort、または abort_Nabort
    MAX_FILESロードするファイルの最大数 (最大 15,000)-
    RETURN_FAILED_ONLY出力で失敗したファイルのみを返すfalse
    COLUMN_MATCH_MODEParquet 用: カラム名のマッチングモードcase-insensitive
    SCHEMA_EVOLUTIONNDJSON 用: ターゲットテーブルに存在しないカラムを推論するために使用されるサンプリングオプション。ENABLE_SCHEMA_EVOLUTION = true と、ターゲットテーブルに対する ALTER 権限が必要です。AUTO サンプリング

    SCHEMA_EVOLUTION のオプション

    SCHEMA_EVOLUTION は、TiDB Cloud Lake がロード前に stage 上の NDJSON ファイルをどのようにサンプリングするかを制御します。ターゲットテーブルで ENABLE_SCHEMA_EVOLUTION = true が設定されている場合に、FILE_FORMAT = (TYPE = NDJSON ...) と組み合わせて使用します。

    stage またはロケーションからのロードで Schema Evolution の推論が実行される場合、COPY INTO <table> を実行するロールには、ターゲットテーブルに対する INSERT 権限と ALTER 権限の両方が必要です。COPY INTO <table> FROM (SELECT ... FROM @stage) のようなクエリベースの COPY では、既存の権限要件が維持されます。

    オプション説明値
    SAMPLE_FILESサンプリングする stage 上のファイル数。AUTO または正の整数
    SAMPLE_RECORDS_PER_FILE選択された各ファイルからサンプリングするレコードの最大数。AUTO または正の整数
    SAMPLE_TOTAL_RECORDS選択されたすべてのファイルにまたがってサンプリングするレコードの最大数。AUTO または正の整数

    SCHEMA_EVOLUTION を省略した場合、TiDB Cloud Lake は 3 つのサンプリングオプションすべてに AUTO を使用します。現在の AUTO の動作では、最大 64 ファイル、各ファイルあたり 1,000 レコード、合計 10,000 レコードまでサンプリングします。これらの内部デフォルト値は、将来のバージョンで変更される可能性があります。ロードがサンプリング戦略に敏感な場合は、SAMPLE_FILES、SAMPLE_RECORDS_PER_FILE、SAMPLE_TOTAL_RECORDS を明示的に設定してください。サンプルで検出されなかったカラムがロード中の後続データに現れた場合、COPY は失敗し、追加のカラム名を報告するため、サンプリング値を増やすことができます。

    出力

    COPY INTO は、以下のカラムを含むデータロード結果のサマリーを提供します。

    カラム型NULL 許容説明
    FILEVARCHARNOソースファイルへの相対パス。
    ROWS_LOADEDINTNOソースファイルからロードされた行数。
    ERRORS_SEENINTNOソースファイル内のエラー行数
    FIRST_ERRORVARCHARYESソースファイルで最初に見つかったエラー。
    FIRST_ERROR_LINEINTYES最初のエラーの行番号。

    RETURN_FAILED_ONLY が true に設定されている場合、出力にはロードに失敗したファイルのみが含まれます。

    例

    外部ストレージソースでは、COPY 文で認証情報を直接指定する代わりに、CONNECTION_NAME パラメータを使用して事前作成済みの接続を利用することを推奨します。この方法により、セキュリティ、管理性、再利用性が向上します。接続の作成方法の詳細については、CREATE CONNECTION を参照してください。

    例 1: stage からのロード

    以下の例は、さまざまな種類の stage から TiDB Cloud Lake にデータをロードする方法を示しています。

      COPY INTO mytable FROM @~ PATTERN = '.*[.]parquet' FILE_FORMAT = (TYPE = PARQUET);
      COPY INTO mytable FROM @my_internal_stage PATTERN = '.*[.]parquet' FILE_FORMAT = (TYPE = PARQUET);
      COPY INTO mytable FROM @my_external_stage PATTERN = '.*[.]parquet' FILE_FORMAT = (TYPE = PARQUET);

      例 2: 外部ロケーションからのロード

      以下の例では、さまざまな種類の外部ソースから TiDB Cloud Lake にデータをロードする方法を示します。

        この例では、事前に作成した接続を使用して Amazon S3 からデータをロードします。

        -- First create a connection (you only need to do this once) CREATE CONNECTION my_s3_conn STORAGE_TYPE = 's3' ACCESS_KEY_ID = '<your-access-key-ID>' SECRET_ACCESS_KEY = '<your-secret-access-key>'; -- Use the connection to load data COPY INTO mytable FROM 's3://mybucket/data.csv' CONNECTION = (CONNECTION_NAME = 'my_s3_conn') FILE_FORMAT = ( TYPE = CSV, FIELD_DELIMITER = ',', RECORD_DELIMITER = '\n', SKIP_HEADER = 1 );

        IAM ロールを使用する場合(本番環境では推奨)

        -- Create connection using IAM role (more secure, recommended for production) CREATE CONNECTION my_iam_conn STORAGE_TYPE = 's3' ROLE_ARN = 'arn:aws:iam::123456789012:role/my_iam_role'; -- Load CSV files using the IAM role connection COPY INTO mytable FROM 's3://mybucket/' CONNECTION = (CONNECTION_NAME = 'my_iam_conn') PATTERN = '.*[.]csv' FILE_FORMAT = ( TYPE = CSV, FIELD_DELIMITER = ',', RECORD_DELIMITER = '\n', SKIP_HEADER = 1 );

        この例では、Azure Blob Storage に接続し、'data.csv' から TiDB Cloud Lake にデータをロードします。

        -- Create connection for Azure Blob Storage CREATE CONNECTION my_azure_conn STORAGE_TYPE = 'azblob' ENDPOINT_URL = 'https://<account_name>.blob.core.windows.net' ACCOUNT_NAME = '<account_name>' ACCOUNT_KEY = '<account_key>'; -- Use the connection to load data COPY INTO mytable FROM 'azblob://mybucket/data.csv' CONNECTION = (CONNECTION_NAME = 'my_azure_conn') FILE_FORMAT = (type = CSV);

        この例では、Google Cloud Storage に接続してデータをロードします。

        -- Create connection for Google Cloud Storage CREATE CONNECTION my_gcs_conn STORAGE_TYPE = 'gcs' CREDENTIAL = '<your-base64-encoded-credential>'; -- Use the connection to load data COPY INTO mytable FROM 'gcs://mybucket/data.csv' CONNECTION = (CONNECTION_NAME = 'my_gcs_conn') FILE_FORMAT = ( TYPE = CSV, FIELD_DELIMITER = ',', RECORD_DELIMITER = '\n', SKIP_HEADER = 1 );

        この例では、3 つのリモート CSV ファイルからデータをロードし、エラーが発生した場合はそのファイルをスキップします。

        COPY INTO mytable FROM 'https://lakesql-bin.tidbcloud.com/datasets/ontime_200{6,7,8}_200.csv' FILE_FORMAT = (type = CSV) ON_ERROR = continue;

        この例では、IPFS 上の CSV ファイルからデータをロードします。

        COPY INTO mytable FROM 'ipfs://<your-ipfs-hash>' CONNECTION = ( ENDPOINT_URL = 'https://<your-ipfs-gateway>' ) FILE_FORMAT = ( TYPE = CSV, FIELD_DELIMITER = ',', RECORD_DELIMITER = '\n', SKIP_HEADER = 1 );

        例 3: 圧縮データのロード

        この例では、Amazon S3 上の GZIP 圧縮された CSV ファイルを TiDB Cloud Lake にロードします。

        -- Create connection for compressed data loading CREATE CONNECTION compressed_s3_conn STORAGE_TYPE = 's3' ACCESS_KEY_ID = '<your-access-key-ID>' SECRET_ACCESS_KEY = '<your-secret-access-key>'; -- Load GZIP-compressed CSV file using the connection COPY INTO mytable FROM 's3://mybucket/data.csv.gz' CONNECTION = (CONNECTION_NAME = 'compressed_s3_conn') FILE_FORMAT = ( TYPE = CSV, FIELD_DELIMITER = ',', RECORD_DELIMITER = '\n', SKIP_HEADER = 1, COMPRESSION = AUTO );

        例 4: PATTERN を使用したファイルのフィルタリング

        この例では、PATTERN パラメータによるパターンマッチングを使用して、Amazon S3 から CSV ファイルをロードする方法を示します。ファイル名に 'sales' を含み、拡張子が '.csv' のファイルをフィルタリングします。

        -- Create connection for pattern-based file loading CREATE CONNECTION pattern_s3_conn STORAGE_TYPE = 's3' ACCESS_KEY_ID = '<your-access-key-ID>' SECRET_ACCESS_KEY = '<your-secret-access-key>'; -- Load CSV files with 'sales' in their names using pattern matching COPY INTO mytable FROM 's3://mybucket/' CONNECTION = (CONNECTION_NAME = 'pattern_s3_conn') PATTERN = '.*sales.*[.]csv' FILE_FORMAT = ( TYPE = CSV, FIELD_DELIMITER = ',', RECORD_DELIMITER = '\n', SKIP_HEADER = 1 );

        ここで、.* は任意の文字が 0 回以上出現することを意味します。角括弧は、ファイル拡張子の前にあるピリオド文字 . をエスケープしています。

        接続を使用してすべての CSV ファイルからロードするには、次のようにします。

        COPY INTO mytable FROM 's3://mybucket/' CONNECTION = (CONNECTION_NAME = 'pattern_s3_conn') PATTERN = '.*[.]csv' FILE_FORMAT = ( TYPE = CSV, FIELD_DELIMITER = ',', RECORD_DELIMITER = '\n', SKIP_HEADER = 1 );

        複数のフォルダを含むパス内の stage 上のファイルに対してパターンを指定する場合、パターンは @<stage_name>[/<path>] より後のパス部分にのみ一致することに注意してください。たとえば、FROM @sales_stage/raw/ の場合、ファイル @sales_stage/raw/year=2025/month=01/sales_20250101.parquet は year=2025/month=01/sales_20250101.parquet としてマッチされます。

        • プレフィックスに続く特定のサブパスに一致させたい場合は、そのプレフィックスをパターンに含めて(例: 'year=2025/month=01/')、そのサブパス内で一致させたいパターン(例: 'sales_')を指定します。

          -- File path: raw/year=2025/month=01/sales_20250101.parquet COPY INTO ... FROM @sales_stage/raw/ PATTERN = 'year=2025/month=01/.*sales_.*[.]parquet') ...
        • ファイルパス内の任意の場所に目的のパターンを含む部分に一致させたい場合は、パターンの前後に '.' を付けて(例: '.sales_20250101.*')、パス内の 'sales_20250101' の任意の出現箇所に一致させます。

          -- File path: raw/year=2025/month=01/sales_20250101.parquet COPY INTO ... FROM @sales_stage/raw/ PATTERN = '.*sales_20250101.*') ...

        例 5: 追加カラムを持つテーブルへのロード

        このセクションでは、サンプルファイル books.csv を使用して、追加カラムを持つテーブルにデータをロードする方法を示します。

        Transaction Processing,Jim Gray,1992 Readings in Database Systems,Michael Stonebraker,2004

        Alt text

        デフォルトでは、COPY INTO はファイル内のフィールドの順序をテーブル内の対応するカラムに対応付けて、テーブルにデータをロードします。ファイルとテーブルの間でデータが正しく対応していることを確認することが重要です。たとえば、次のようになります。

        CREATE TABLE books ( title VARCHAR, author VARCHAR, date VARCHAR ); COPY INTO books FROM 'https://lakesql-bin.tidbcloud.com/datasets/books.csv' FILE_FORMAT = (TYPE = CSV);

        テーブルのカラム数がファイルより多い場合は、データをロードする対象のカラムを指定できます。たとえば、次のようになります。

        CREATE TABLE books_with_language ( title VARCHAR, language VARCHAR, author VARCHAR, date VARCHAR ); COPY INTO books_with_language (title, author, date) FROM 'https://lakesql-bin.tidbcloud.com/datasets/books.csv' FILE_FORMAT = (TYPE = CSV);

        テーブルのカラム数がファイルより多く、追加カラムがテーブルの末尾にある場合は、FILE_FORMAT オプション ERROR_ON_COLUMN_COUNT_MISMATCH を使用してデータをロードできます。これにより、各カラムを個別に指定しなくてもデータをロードできます。なお、ERROR_ON_COLUMN_COUNT_MISMATCH は現在、CSV ファイル形式でのみ機能します。

        CREATE TABLE books_with_extra_columns ( title VARCHAR, author VARCHAR, date VARCHAR, language VARCHAR, region VARCHAR ); COPY INTO books_with_extra_columns FROM 'https://lakesql-bin.tidbcloud.com/datasets/books.csv' FILE_FORMAT = (TYPE = CSV, ERROR_ON_COLUMN_COUNT_MISMATCH = false);

        例 6: カスタム形式での JSON のロード

        この例では、次の内容を持つ CSV ファイル "data.csv" からデータをロードします。

        1,"U00010","{\"carPriceList\":[{\"carTypeId\":10,\"distance\":5860},{\"carTypeId\":11,\"distance\":5861}]}" 2,"U00011","{\"carPriceList\":[{\"carTypeId\":12,\"distance\":5862},{\"carTypeId\":13,\"distance\":5863}]}"

        各行には 3 つのカラムのデータが含まれており、3 番目のカラムは JSON データを含む文字列です。JSON フィールドを含む CSV データを正しくロードするには、適切なエスケープ文字を設定する必要があります。この例では、JSON データにダブルクォート " が含まれているため、バックスラッシュ \ をエスケープ文字として使用します。

        ステップ 1: カスタムファイル形式を作成する

        -- Define a custom CSV file format with the escape character set to backslash \ CREATE FILE FORMAT my_csv_format TYPE = CSV ESCAPE = '\\';

        ステップ 2: ターゲットテーブルを作成する

        CREATE TABLE t ( id INT, seq VARCHAR, p_detail VARCHAR );

        ステップ 3: カスタムファイル形式でロードする

        COPY INTO t FROM @t_stage FILES=('data.csv') FILE_FORMAT=(FORMAT_NAME='my_csv_format');

        例 7: 無効な JSON のロード

        Variant カラムにデータをロード (load) する際、TiDB Cloud Lake はデータの妥当性を自動的にチェックし、無効なデータがある場合はエラーを返します。たとえば、ユーザー stage に invalid_json_string.parquet という名前の Parquet ファイルがあり、その中に次のような無効な JSON データが含まれているとします。

        SELECT * FROM @~/invalid_json_string.parquet; ┌────────────────────────────────────┐ │ a │ b │ ├─────────────────┼──────────────────┤ │ 5 │ {"k":"v"} │ │ 6 │ [1, │ └────────────────────────────────────┘ DESC t2; ┌──────────────────────────────────────────────┐ │ Field │ Type │ Null │ Default │ Extra │ ├────────┼─────────┼────────┼─────────┼────────┤ │ a │ VARCHAR │ YES │ NULL │ │ │ b │ VARIANT │ YES │ NULL │ │ └──────────────────────────────────────────────┘

        このデータをテーブルにロードしようとすると、エラーが発生します。

        COPY INTO t2 FROM @~/invalid_json_string.parquet FILE_FORMAT = (TYPE = PARQUET) ON_ERROR = CONTINUE; error: APIError: ResponseError with 1006: EOF while parsing a value, pos 3 while evaluating function `parse_json('[1,')`

        JSON の妥当性チェックを行わずにロードするには、COPY INTO 文で DISABLE_VARIANT_CHECK オプションを true に設定します。

        COPY INTO t2 FROM @~/invalid_json_string.parquet FILE_FORMAT = (TYPE = PARQUET) DISABLE_VARIANT_CHECK = true ON_ERROR = CONTINUE; ┌───────────────────────────────────────────────────────────────────────────────────────────────┐ │ File │ Rows_loaded │ Errors_seen │ First_error │ First_error_line │ ├─────────────────────────────┼─────────────┼─────────────┼──────────────────┼──────────────────┤ │ invalid_json_string.parquet │ 2 │ 0 │ NULL │ NULL │ └───────────────────────────────────────────────────────────────────────────────────────────────┘ SELECT * FROM t2; -- Invalid JSON is stored as null in the Variant column. ┌──────────────────────────────────────┐ │ a │ b │ ├──────────────────┼───────────────────┤ │ 5 │ {"k":"v"} │ │ 6 │ null │ └──────────────────────────────────────┘

        例 8: Schema Evolution を使用したロード

        スキーマにターゲットテーブルに存在しないカラムを含む Parquet または NDJSON ファイルをロードする場合、Schema Evolution を使用して不足しているカラムを自動的に追加できます。Schema Evolution の推論を実行する stage またはロケーションからのロードでは、ロードを実行するロールにターゲットテーブルに対する INSERT および ALTER 権限が必要です。まず、テーブルで Schema Evolution を有効にします。

        CREATE OR REPLACE TABLE invoices(order_id INT); -- Enable schema evolution ALTER TABLE invoices SET OPTIONS(ENABLE_SCHEMA_EVOLUTION = true);

        Parquet

        次に、異なるスキーマを持つ Parquet ファイルをロードします。TiDB Cloud Lake は新しいカラムを自動的に追加し、不足している値を NULL で埋めます。

        -- Assume @my_stage contains Parquet files with extra columns (e.g., amount, currency) COPY INTO invoices FROM @my_stage/ FILE_FORMAT = (TYPE = PARQUET MISSING_FIELD_AS = FIELD_DEFAULT);

        NDJSON

        NDJSON の場合、COPY INTO はデフォルトのサンプリング値を使用して不足しているカラムを推論します。TiDB Cloud Lake が stage 上のファイルをどのようにサンプリングするかを上書きしたい場合にのみ、SCHEMA_EVOLUTION を追加してください。

        CREATE OR REPLACE TABLE events(id INT); ALTER TABLE events SET OPTIONS(ENABLE_SCHEMA_EVOLUTION = true); -- Assume @events_stage contains NDJSON records such as: -- {"id":1,"city":"SF","score":9} COPY INTO events FROM @events_stage/ FILE_FORMAT = (TYPE = NDJSON MISSING_FIELD_AS = FIELD_DEFAULT) SCHEMA_EVOLUTION = ( SAMPLE_FILES = AUTO, SAMPLE_RECORDS_PER_FILE = AUTO, SAMPLE_TOTAL_RECORDS = AUTO );

        TiDB Cloud Lake は stage 上の NDJSON ファイルをサンプリングし、city や score などの推論されたフィールドを NULL 許容カラムとして追加してから、データをロードします。

        詳細は、Schema Evolution を参照してください。

        このページは役に立ちましたか?