COPY INTO <table>

将数据从暂存文件加载到现有表中。文件必须已暂存在以下位置之一:

  • 命名的内部暂存区(或表/用户暂存区)。可以使用 PUT 命令暂存文件。

  • 引用外部位置(Amazon S3、Google Cloud Storage 或 Microsoft Azure)的命名外部暂存区。

    您不能访问存档云存储类别中保存的数据,这些数据需要恢复后才能检索。例如,这些存档存储类别包括 Amazon S3 Glacier Flexible Retrieval 或 Glacier Deep Archive 存储类别,或者 Microsoft Azure Archive Storage。

  • 外部位置(Amazon S3、Google Cloud Storage 或 Microsoft Azure)。

另请参阅:

COPY INTO <location>

语法

/* Standard data load */
COPY INTO [<namespace>.]<table_name>
     FROM { internalStage | externalStage | externalLocation }
[ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ]
[ PATTERN = '<regex_pattern>' ]
[ FILE_FORMAT = ( { FORMAT_NAME = '[<namespace>.]<file_format_name>' |
                    TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ copyOptions ]
[ VALIDATION_MODE = RETURN_<n>_ROWS | RETURN_ERRORS | RETURN_ALL_ERRORS ]

/* Data load with transformation */
COPY INTO [<namespace>.]<table_name> [ ( <col_name> [ , <col_name> ... ] ) ]
     FROM ( SELECT [<alias>.]$<file_col_num>[.<element>] [ , [<alias>.]$<file_col_num>[.<element>] ... ]
            FROM { internalStage | externalStage } )
[ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ]
[ PATTERN = '<regex_pattern>' ]
[ FILE_FORMAT = ( { FORMAT_NAME = '[<namespace>.]<file_format_name>' |
                    TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ copyOptions ]
Copy

其中:

internalStage ::=
    @[<namespace>.]<int_stage_name>[/<path>]
  | @[<namespace>.]%<table_name>[/<path>]
  | @~[/<path>]
Copy
externalStage ::=
  @[<namespace>.]<ext_stage_name>[/<path>]
Copy
externalLocation (for Amazon S3) ::=
  's3://<bucket>[/<path>]'
  [ { STORAGE_INTEGRATION = <integration_name> } | { CREDENTIALS = ( {  { AWS_KEY_ID = '<string>' AWS_SECRET_KEY = '<string>' [ AWS_TOKEN = '<string>' ] } } ) } ]
  [ ENCRYPTION = ( [ TYPE = 'AWS_CSE' ] [ MASTER_KEY = '<string>' ] |
                   [ TYPE = 'AWS_SSE_S3' ] |
                   [ TYPE = 'AWS_SSE_KMS' [ KMS_KEY_ID = '<string>' ] ] |
                   [ TYPE = 'NONE' ] ) ]
Copy
externalLocation (for Google Cloud Storage) ::=
  'gcs://<bucket>[/<path>]'
  [ STORAGE_INTEGRATION = <integration_name> ]
  [ ENCRYPTION = ( [ TYPE = 'GCS_SSE_KMS' ] [ KMS_KEY_ID = '<string>' ] | [ TYPE = 'NONE' ] ) ]
Copy
externalLocation (for Microsoft Azure) ::=
  'azure://<account>.blob.core.windows.net/<container>[/<path>]'
  [ { STORAGE_INTEGRATION = <integration_name> } | { CREDENTIALS = ( [ AZURE_SAS_TOKEN = '<string>' ] ) } ]
  [ ENCRYPTION = ( [ TYPE = { 'AZURE_CSE' | 'NONE' } ] [ MASTER_KEY = '<string>' ] ) ]
Copy
formatTypeOptions ::=
-- If FILE_FORMAT = ( TYPE = CSV ... )
     COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
     RECORD_DELIMITER = '<character>' | NONE
     FIELD_DELIMITER = '<character>' | NONE
     PARSE_HEADER = TRUE | FALSE
     SKIP_HEADER = <integer>
     SKIP_BLANK_LINES = TRUE | FALSE
     DATE_FORMAT = '<string>' | AUTO
     TIME_FORMAT = '<string>' | AUTO
     TIMESTAMP_FORMAT = '<string>' | AUTO
     BINARY_FORMAT = HEX | BASE64 | UTF8
     ESCAPE = '<character>' | NONE
     ESCAPE_UNENCLOSED_FIELD = '<character>' | NONE
     TRIM_SPACE = TRUE | FALSE
     FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | NONE
     NULL_IF = ( '<string>' [ , '<string>' ... ] )
     ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE | FALSE
     REPLACE_INVALID_CHARACTERS = TRUE | FALSE
     EMPTY_FIELD_AS_NULL = TRUE | FALSE
     SKIP_BYTE_ORDER_MARK = TRUE | FALSE
     ENCODING = '<string>' | UTF8
-- If FILE_FORMAT = ( TYPE = JSON ... )
     COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
     DATE_FORMAT = '<string>' | AUTO
     TIME_FORMAT = '<string>' | AUTO
     TIMESTAMP_FORMAT = '<string>' | AUTO
     BINARY_FORMAT = HEX | BASE64 | UTF8
     TRIM_SPACE = TRUE | FALSE
     NULL_IF = ( '<string>' [ , '<string>' ... ] )
     ENABLE_OCTAL = TRUE | FALSE
     ALLOW_DUPLICATE = TRUE | FALSE
     STRIP_OUTER_ARRAY = TRUE | FALSE
     STRIP_NULL_VALUES = TRUE | FALSE
     REPLACE_INVALID_CHARACTERS = TRUE | FALSE
     IGNORE_UTF8_ERRORS = TRUE | FALSE
     SKIP_BYTE_ORDER_MARK = TRUE | FALSE
-- If FILE_FORMAT = ( TYPE = AVRO ... )
     COMPRESSION = AUTO | GZIP | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
     TRIM_SPACE = TRUE | FALSE
     REPLACE_INVALID_CHARACTERS = TRUE | FALSE
     NULL_IF = ( '<string>' [ , '<string>' ... ] )
-- If FILE_FORMAT = ( TYPE = ORC ... )
     TRIM_SPACE = TRUE | FALSE
     REPLACE_INVALID_CHARACTERS = TRUE | FALSE
     NULL_IF = ( '<string>' [ , '<string>' ... ] )
-- If FILE_FORMAT = ( TYPE = PARQUET ... )
     COMPRESSION = AUTO | SNAPPY | NONE
     BINARY_AS_TEXT = TRUE | FALSE
     USE_LOGICAL_TYPE = TRUE | FALSE
     TRIM_SPACE = TRUE | FALSE
     REPLACE_INVALID_CHARACTERS = TRUE | FALSE
     NULL_IF = ( '<string>' [ , '<string>' ... ] )
-- If FILE_FORMAT = ( TYPE = XML ... )
     COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
     IGNORE_UTF8_ERRORS = TRUE | FALSE
     PRESERVE_SPACE = TRUE | FALSE
     STRIP_OUTER_ELEMENT = TRUE | FALSE
     DISABLE_SNOWFLAKE_DATA = TRUE | FALSE
     DISABLE_AUTO_CONVERT = TRUE | FALSE
     REPLACE_INVALID_CHARACTERS = TRUE | FALSE
     SKIP_BYTE_ORDER_MARK = TRUE | FALSE
Copy
copyOptions ::=
     ON_ERROR = { CONTINUE | SKIP_FILE | SKIP_FILE_<num> | 'SKIP_FILE_<num>%' | ABORT_STATEMENT }
     SIZE_LIMIT = <num>
     PURGE = TRUE | FALSE
     RETURN_FAILED_ONLY = TRUE | FALSE
     MATCH_BY_COLUMN_NAME = CASE_SENSITIVE | CASE_INSENSITIVE | NONE
     INCLUDE_METADATA = ( <column_name> = METADATA$<field> [ , <column_name> = METADATA${field} ... ] )
     ENFORCE_LENGTH = TRUE | FALSE
     TRUNCATECOLUMNS = TRUE | FALSE
     FORCE = TRUE | FALSE
     LOAD_UNCERTAIN_FILES = TRUE | FALSE
Copy

必填参数

[namespace.]table_name

指定将数据加载到的表的名称。

命名空间可以选择以 database_name.schema_nameschema_name 的形式指定表的数据库和/或架构。如果数据库和架构当前正在用户会话中使用,则此参数为 选填;否则,为必填。

FROM ...

对于要加载数据的文件,请指定暂存该文件的内部或外部位置:

@[namespace.]int_stage_name[/path]

文件位于指定的已命名内部暂存区。

@[namespace.]ext_stage_name[/path]

文件位于指定的命名外部暂存区。

@[namespace.]%table_name[/path]

文件位于指定表的暂存区中。

@~[/path]

文件位于当前用户的暂存区。

's3://bucket[/path]'

文件位于指定的外部位置(S3 桶)中。可能需要其他参数。有关详细信息,请参阅 其他云提供商参数 (本主题内容)。

'gcs://bucket[/path]'

文件位于指定的外部位置(Google Cloud Storage 桶)中。可能需要其他参数。有关详细信息,请参阅 其他云提供商参数 (本主题内容)。

'azure://account.blob.core.windows.net/container[/path]'

文件位于指定的外部位置(Azure 容器)中。可能需要其他参数。有关详细信息,请参阅 其他云提供商参数 (本主题内容)。

其中:

  • namespace 是内部或外部暂存区所在的数据库和/或架构,形式为 database_name.schema_nameschema_name。如果数据库和架构当前正在用户会话中使用,则此参数为 选填;否则,为必填。

  • path 是云存储位置中文件(即文件的名称以通用字符串开头)的可选路径(区分大小写),用于限制要加载的文件集。不同的云存储服务也可以将路径称为 前缀文件夹

    相对路径修饰符(如 /.//../)按字面解释,因为“路径”是名称的字面量前缀。例如:

    -- S3 bucket
    COPY INTO mytable FROM 's3://mybucket/./../a.csv';
    
    -- Google Cloud Storage bucket
    COPY INTO mytable FROM 'gcs://mybucket/./../a.csv';
    
    -- Azure container
    COPY INTO mytable FROM 'azure://myaccount.blob.core.windows.net/mycontainer/./../a.csv';
    
    Copy

    在这些 COPY 语句中,Snowflake 在外部位置中查找字面名称为 ./../a.csv 的文件。

备注

  • 如果内部或外部暂存区或路径名中包含特殊字符(包括空格),请将 FROM ... 字符串放在单引号内。

  • FROM ... 值必须是字面量常量。该值不能是 SQL 变量

其他云提供商参数

STORAGE_INTEGRATION = integration_name . CREDENTIALS = ( cloud_specific_credentials )

当 COPY 语句中的 FROM 值为外部存储 URI,而非外部暂存区名称时,支持这些参数。

仅从外部私有/受保护的云存储位置加载时才需要这些参数;从公有存储桶/容器中加载时无需这些参数。

指定用于连接到云提供商和访问暂存数据文件的专用/受保护存储容器的安全凭据。

Amazon S3

STORAGE_INTEGRATION = integration_name

指定将外部云存储的身份验证责任委托给 Snowflake Identity and Access Management (IAM) 实体的存储集成的名称。有关更多详细信息,请参阅 CREATE STORAGE INTEGRATION

备注

我们强烈建议使用存储集成。此选项避免了在创建暂存或加载数据时使用 CREDENTIALS 参数提供云存储凭据的需要。

CREDENTIALS = ( AWS_KEY_ID = 'string' AWS_SECRET_KEY = 'string' [ AWS_TOKEN = 'string' ] )

指定用于连接到 AWS 和访问暂存要加载的文件的专用/受保护 S3 桶的安全凭据。有关更多信息,请参阅 配置对 Amazon S3 的安全访问

您指定的凭证取决于您是否将桶的 Snowflake 访问权限与 AWS IAM (Identity & Access Management) 用户或角色关联:

  • IAM 用户: 需要临时 IAM 凭据。临时(又名“作用域”)凭据由 AWS Security Token Service (STS) 生成,由三个组件组成:

    • AWS_KEY_ID

    • AWS_SECRET_KEY

    • AWS_TOKEN

    访问专用/受保护的桶 需要 这三个组件。指定时间段后,临时凭证将过期,无法再使用。然后,您必须生成一组新的有效临时凭据。

    重要

    COPY 命令包含复杂的语法和敏感信息,如凭据。此外,这些命令会频繁执行,且通常存储在脚本或工作表中,这可能会导致敏感信息在无意中暴露。COPY 命令允许使用永久(也称为“长期”)凭据;但是,出于安全原因,请勿在 COPY 命令中使用 永久 凭据。请改用临时凭据。

    如果必须使用永久凭据,请使用 外部暂存区,因其只需输入一次凭据即可进行安全存储,从而可以最大程度地减少暴露的可能性。

  • IAM 角色: 省略安全凭证和访问密钥,而是使用 AWS_ROLE 并指定 AWS 角色 ARN (Amazon Resource Name) 来标识角色。

Google Cloud Storage

STORAGE_INTEGRATION = integration_name

指定将外部云存储的身份验证责任委托给 Snowflake Identity and Access Management (IAM) 实体的存储集成的名称。有关更多详细信息,请参阅 CREATE STORAGE INTEGRATION

Microsoft Azure

STORAGE_INTEGRATION = integration_name

指定将外部云存储的身份验证责任委托给 Snowflake Identity and Access Management (IAM) 实体的存储集成的名称。有关更多详细信息,请参阅 CREATE STORAGE INTEGRATION

备注

我们强烈建议使用存储集成。此选项避免了在创建暂存或加载数据时使用 CREDENTIALS 参数提供云存储凭据的需要。

CREDENTIALS = ( AZURE_SAS_TOKEN = 'string' )

指定 SAS(共享访问签名)令牌,用于连接到 Azure 并访问暂存包含数据的文件的专用/受保护容器。凭据由 Azure 生成。

ENCRYPTION = ( cloud_specific_encryption )

:emph:` 用于临时 COPY 语句(不引用命名外部暂存区的语句)。仅从加密文件加载时需要;如果文件未加密,则不需要。`指定用于解密存储位置中的加密文件和提取数据的加密设置。

Amazon S3

ENCRYPTION = ( [ TYPE = 'AWS_CSE' ] [ MASTER_KEY = '<string>' ] | [ TYPE = 'AWS_SSE_S3' ] | [ TYPE = 'AWS_SSE_KMS' [ KMS_KEY_ID = '<string>' ] ] | [ TYPE = 'NONE' ] )

TYPE = ...

指定使用的加密类型。可能的值:

  • AWS_CSE:客户端加密(需要一个 MASTER_KEY 值)。目前,您提供的客户端 主密钥 (https://csrc.nist.gov/glossary/term/master_key) 只能是对称密钥。请注意,当提供 MASTER_KEY 值时,Snowflake 假定 TYPE = AWS_CSE`(即,当提供 :samp:`MASTER_KEY 值时,不需要 TYPE)。

  • AWS_SSE_S3:不需要其他加密设置的服务器端加密。

  • AWS_SSE_KMS:接受可选的 KMS_KEY_ID 值服务端加密。

  • NONE:无加密。

有关加密类型的详细信息,请参阅 客户端加密 (http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html) 或 服务器端加密 (http://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html) 的 AWS 文档。

MASTER_KEY = 'string'`(仅适用于 :samp:`AWS_CSE 加密)

指定用于加密桶中文件的客户端主密钥。主密钥必须是 Base64 编码形式的 128 位或 256 位密钥。

KMS_KEY_ID = 'string'`(仅适用于 :samp:`AWS_SSE_KMS 加密)

(可选)指定用于加密 卸载 到桶中的文件的 AWS KMS 托管密钥的 ID。如果未提供任何值,则默认 KMS 密钥 ID 用于在卸载时加密文件。

请注意,数据加载时会忽略此值。

Google Cloud Storage

ENCRYPTION = ( [ TYPE = 'GCS_SSE_KMS' | 'NONE' ] [ KMS_KEY_ID = 'string' ] )

TYPE = ...

指定使用的加密类型。可能的值:

  • GCS_SSE_KMS:接受可选的 KMS_KEY_ID 值服务端加密。

    有关更多信息,请参阅 Google Cloud Platform 文档:

    • https://cloud.google.com/storage/docs/encryption/customer-managed-keys (https://cloud.google.com/storage/docs/encryption/customer-managed-keys)

    • https://cloud.google.com/storage/docs/encryption/using-customer-managed-keys (https://cloud.google.com/storage/docs/encryption/using-customer-managed-keys)

  • NONE:无加密。

KMS_KEY_ID = 'string'`(仅适用于 :samp:`GCS_SSE_KMS 加密)

(可选)指定用于加密 卸载 到桶中的文件的 Cloud KMS 托管密钥的 ID。如果未提供任何值,则桶中默认设置的 KMS 密钥 ID 用于在卸载时加密文件。

请注意,数据加载时会忽略此值。如果服务账户有足够的权限来解密桶中的数据,则加载操作应会成功。

Microsoft Azure

ENCRYPTION = ( [ TYPE = 'AZURE_CSE' | 'NONE' ] [ MASTER_KEY = 'string' ] )

TYPE = ...

指定使用的加密类型。可能的值:

  • AZURE_CSE:客户端加密(需要一个 MASTER_KEY 值)。有关信息,请参阅 Microsoft Azure 文档中的 客户端加密信息 (https://docs.microsoft.com/en-us/azure/storage/common/storage-client-side-encryption)。

  • NONE:无加密。

:samp:`MASTER_KEY = '{string}'`(仅适用于 AZURE_CSE 加密)

指定用于解密文件的客户端主密钥。主密钥必须是 Base64 编码形式的 128 位或 256 位密钥。

转换参数

( SELECT [alias.]$file_col_num[.element] [ , [alias.]$file_col_num[.element] ... ] FROM ... [ alias ] )

在加载期间转换数据时需要

指定要从暂存数据文件中加载的一组显式字段/列(用逗号分隔)。使用标准 SQL 查询(即 SELECT 列表)从文件中选择字段/列,其中:

alias

指定 FROM 值的可选别名(例如 COPY INTO t1 (c1) FROM (SELECT d.$1 FROM @mystage/file1.csv.gz d); 中的 d)。

file_col_num

指定包含要加载的数据的字段/列(在文件中)的位置编号(第一个字段为 1,第二个字段为 2,等等)

element

指定数据文件中重复值的路径和元素名称(仅适用于 半结构化数据文件)。

SELECT 列表定义了加载数据文件中字段/列的编号集。该列表 必须 与目标表中的列序列相匹配。您可以使用可选 ( col_name [ , col_name ... ] ) 参数将列表映射到目标表中的特定列。

请注意,数据文件中的实际字段/列顺序可能与目标表中的列顺序不同。重要的是,SELECT 列表要将数据文件中的字段/列映射到表中的 相应 列。

备注

用于转换的 SELECT 语句不支持所有函数。有关支持的函数的完整列表以及有关数据加载转换的更多详细信息(包括示例),请参阅 在加载期间转换数据 中的用法说明。

此外,数据加载转换 支持从用户暂存区和命名暂存区(内部或外部)中选择数据。

( col_name [ , col_name ... ] )

可以选择指定要插入数据的表列的显式列表(用逗号分隔):

  • 第一列使用从加载的文件中提取的第一个字段/列生成的值。

  • 第二列使用从加载的文件中提取的第二个字段/列生成的值。

  • 以此类推,按指定的顺序进行。

此列表中不能存在重复列。从此列列表中排除的任何列都由其默认值(如果未指定,则为 NULL)填充。但是,不能 将被排除列的序列作为其默认值。

可选参数

FILES = ( 'file_name' [ , 'file_name' ... ] )

指定要加载的一个或多个文件名列表(用逗号分隔)。文件必须已暂存到命令中指定的 Snowflake 内部位置或外部位置。如果找不到任何指定的文件,则默认行为 ON_ERROR = ABORT_STATEMENT 将中止加载操作,除非在 COPY 语句中显式设置了不同 ON_ERROR 选项。

可以指定的最大文件名数为 1000。

备注

仅适用于外部暂存区(Amazon S3、Google Cloud Storage 或 Microsoft Azure),文件路径通过连接暂存区中定义的 URL 和已解析的文件名列表来设置。

但是,Snowflake 不会在路径和文件名之间隐式插入分隔符。您必须在暂存区定义中 URL 的末尾或此参数中指定的每个文件名的开头显式插入分隔符 (/)。

PATTERN = 'regex_pattern'

正则表达式模式字符串放在单引号内,可指定要匹配的文件名和/或路径。

小技巧

为了获得最佳性能,请尽量避免应用对大量文件进行筛选的模式。

请注意,正则表达式在批量数据加载和 Snowpipe 数据加载中的应用方式是不同的。

  • Snowpipe 从存储位置修剪暂存区定义中的任何路径段,并将正则表达式应用于任何剩余的路径段和文件名。要查看暂存区定义,请执行针对暂存区的 DESCRIBE STAGE 命令。URL 属性由桶或容器名称以及零个或多个路径段组成。例如,如果 FROM 位置位于 COPY INTO <table> statement is @s/path1/path2/ and the URL value for stage @s is s3://mybucket/path1/, then Snowpipe trims /path1/ from the storage location in the FROM clause and applies the regular expression to path2/ 中,加上路径中的文件名。

  • 批量数据加载操作将正则表达式应用于 FROM 子句中的整个存储位置。

FILE_FORMAT = ( FORMAT_NAME = 'file_format_name' ) . FILE_FORMAT = ( TYPE = CSV | JSON | AVRO | ORC | PARQUET | XML [ ... ] )

指定要加载的数据文件的格式:

FORMAT_NAME = 'file_format_name'

指定用于将数据加载到表中的现有命名文件格式。命名文件格式决定数据文件的格式类型(CSV、JSON 等)以及其他任何格式选项。有关更多信息,请参阅 CREATE FILE FORMAT

TYPE = CSV | JSON | AVRO | ORC | PARQUET | XML [ ... ]

指定要加载到表中的文件类型。如果指定了格式类型,则可以指定其他特定于格式的选项。有关更多详细信息,请参阅 格式类型选项 (本主题内容)。

备注

FORMAT_NAMETYPE 是互斥的;在同一条 COPY 命令中同时指定两者可能会出现意外行为。

COPY_OPTIONS = ( ... )

为加载的数据指定一个或多个复制选项。有关更多详细信息,请参阅 复制选项 (本主题内容)。

VALIDATION_MODE = RETURN_n_ROWS | RETURN_ERRORS | RETURN_ALL_ERRORS

字符串(常量),指示 COPY 命令验证数据文件,而不是 将它们加载到指定的表中;即 COPY 命令测试文件是否存在错误,但不加载这些文件。该命令验证要加载的数据,并根据指定的验证选项返回结果:

支持的值

备注

RETURN_n_ROWS`(例如 :samp:`RETURN_10_ROWS

如果未遇到错误,则验证指定的行数;否则,在行中遇到第一个错误时失败。

RETURN_ERRORS

返回 COPY 语句中指定的所有文件中的所有错误(解析、转换等)。

RETURN_ALL_ERRORS

返回 COPY 语句中指定的所有文件的所有错误,包括在先前加载过程中因 ON_ERROR 复制选项设置为 CONTINUE 而部分加载的有错误的文件。

备注

  • VALIDATION_MODE 参数不支持在加载期间转换数据的 COPY 语句。如果指定了该参数,则 COPY 语句将返回错误。

  • 使用 VALIDATE 表函数查看在上一次加载期间遇到的所有错误。请注意,此函数也不支持在加载期间转换数据的 COPY 语句。

格式类型选项 (formatTypeOptions)

根据指定的文件格式类型 (FILE_FORMAT = ( TYPE = ... )),可以包含以下一个或多个特定于格式的选项(用空格、逗号或换行符分隔):

TYPE = CSV

COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE

字符串(常量)可用于指定要加载的数据文件的当前压缩算法。Snowflake 使用此选项来检测 已压缩 数据文件的压缩方式,以便提取文件中的压缩数据进行加载。

支持的值

备注

AUTO

压缩算法会自动检测,但 Brotli 压缩文件除外(目前无法自动检测)。如果加载 Brotli 压缩的文件,请显式使用 BROTLI 而不是 AUTO

GZIP

BZ2

BROTLI

加载 Brotli 压缩文件时必须进行指定。

ZSTD

支持 Zstandard v0.8(及更高版本)。

DEFLATE

使用 Deflate 压缩的文件(带有 zlib 标头、RFC1950)。

RAW_DEFLATE

使用 Raw Deflate 压缩的文件(无标头、RFC1951)。

NONE

要加载的数据文件尚未压缩。

RECORD_DELIMITER = 'character' | NONE

用于分隔输入文件中记录的一个或多个字符。接受常见的转义序列或以下单字节或多字节字符:

单字节字符:

八进制值(以 \\ 为前缀)或十六进制值(以 0x\x 为前缀)。例如,对于由重音符号 (^) 字符分隔的记录,请指定八进制 (\\136) 或十六进制 (0x5e) 值。

多字节字符:

十六进制值(前缀为 \x)。例如,对于由分 (¢) 字符分隔的记录,请指定十六进制 (\xC2\xA2) 值。

RECORD_DELIMITER 或 FIELD_DELIMITER 分隔符不能是其他文件格式选项(例如 FIELD_DELIMITER = 'aa' RECORD_DELIMITER = 'aabb')的分隔符的子字符串。

指定的分隔符必须是有效的 UTF-8 字符,而不是随机的字节序列。另请注意,分隔符限制为最多 20 个字符。

也接受 NONE 的值。

默认值:换行符。请注意,“换行符”是合乎逻辑的,因而 \r\n 可以理解为 Windows 平台上文件的换行符。

FIELD_DELIMITER = 'character' | NONE

一个或多个单字节或多字节字符,用于分隔输入文件中的字段。接受常见的转义序列或以下单字节或多字节字符:

单字节字符:

八进制值(以 \\ 为前缀)或十六进制值(以 0x\x 为前缀)。例如,对于由重音符号 (^) 字符分隔的记录,请指定八进制 (\\136) 或十六进制 (0x5e) 值。

多字节字符:

十六进制值(前缀为 \x)。例如,对于由分 (¢) 字符分隔的记录,请指定十六进制 (\xC2\xA2) 值。

RECORD_DELIMITER 或 FIELD_DELIMITER 分隔符不能是其他文件格式选项(例如 FIELD_DELIMITER = 'aa' RECORD_DELIMITER = 'aabb')的分隔符的子字符串。

备注

对于非 ASCII 字符,必须使用十六进制字节序列值来获取确定性行为。

指定的分隔符必须是有效的 UTF-8 字符,而不是随机的字节序列。另请注意,分隔符限制为最多 20 个字符。

也接受 NONE 的值。

默认值:逗号 (,)

PARSE_HEADER = TRUE | FALSE

布尔,指定是否使用数据文件中的第一行标题来确定列名称。

此文件格式选项仅适用于以下操作:

  • 使用 INFER_SCHEMA 函数自动检测列定义。

  • 使用 INFER_SCHEMA 函数和 MATCH_BY_COLUMN_NAME 复制选项将 CSV 数据加载到单独的列中。

如果该选项设置为 TRUE,则第一行标题将用于确定列名称。默认值 FALSE 将返回 c* 形式的列名称,其中 * 是列的位置。

请注意,PARSE_HEADER = TRUE 时不支持 SKIP_HEADER 选项。

默认:FALSE

SKIP_HEADER = integer

要跳过的文件开头的行数。

注意,SKIP_HEADER 不使用 RECORD_DELIMITER 或 FIELD_DELIMITER 值来决定标头行;相反,它会直接跳过文件中指定数量的以 CRLF(回车符、换行)分隔的行。然后,使用 RECORD_DELIMITER 和 FIELD_DELIMITER 确定要加载的数据行。

默认:0

SKIP_BLANK_LINES = TRUE | FALSE
使用:

仅加载数据

定义:

布尔,指定是否跳过数据文件中遇到的任何空行;否则,空行将产生记录结束错误(默认行为)。

默认:FALSE

DATE_FORMAT = 'string' | AUTO

定义要加载的数据文件中日期值格式的字符串。如果未指定值或值为 AUTO,则使用 DATE_INPUT_FORMAT 会话的值。

默认:AUTO

TIME_FORMAT = 'string' | AUTO

定义要加载的数据文件中时间值格式的字符串。如果未指定值或值为 AUTO,则使用 TIME_INPUT_FORMAT 会话的值。

默认:AUTO

TIMESTAMP_FORMAT = 'string' | AUTO

定义要加载的数据文件中时间戳值格式的字符串。如果未指定值或值为 AUTO,则使用 TIMESTAMP_INPUT_FORMAT 会话的值。

默认:AUTO

BINARY_FORMAT = HEX | BASE64 | UTF8

字符串(常量)可用于定义二进制输入或输出的编码格式。此选项仅适用于将数据载入表格中的二进制列。

默认:HEX

ESCAPE = 'character' | NONE
使用:

数据加载和卸载

定义:

仅用作封闭字段值的转义字符的单字节字符串。转义字符对字符序列中的后续字符调用替代解释。您可以使用 ESCAPE 字符将数据中 FIELD_OPTIONALLY_ENCLOSED_BY 字符的实例解释为字面量。

接受常见的转义序列(例如 \t 表示制表符、\n 表示换行符、\r 表示回车符、\\ 表示反斜杠)、八进制值或十六进制值。

备注

此文件格式选项仅支持单字节字符。请注意,UTF-8 字符编码将高阶 ASCII 字符表示为多字节字符。如果数据文件使用 UTF-8 字符集进行编码,则不能将高阶 ASCII 字符指定为选项值。

此外,如果指定高阶 ASCII 字符,建议将文件格式选项设置为 ENCODING = 'string' 数据文件的字符编码,以确保正确解释该字符。

默认值:

NONE

ESCAPE_UNENCLOSED_FIELD = 'character' | NONE
使用:

数据加载和卸载

定义:

仅用作未封闭字段值的转义字符的单字节字符串。转义字符对字符序列中的后续字符调用替代解释。您可以使用 ESCAPE 字符将数据中 FIELD_DELIMITERRECORD_DELIMITER 字符的实例解释为字面量。转义字符还可用于对数据中自身的实例进行转义。

接受常见的转义序列(例如 \t 表示制表符、\n 表示换行符、\r 表示回车符、\\ 表示反斜杠)、八进制值或十六进制值。

备注

  • 默认值为 \\。如果数据文件中的行以反斜杠 (\) 字符结尾,则此字符将转义为 RECORD_DELIMITER 文件格式选项指定的换行符或回车符。因此,加载操作会将此行和下一行视为单行数据。若要避免此问题,请将值设置为 NONE

  • 此文件格式选项仅支持单字节字符。请注意,UTF-8 字符编码将高阶 ASCII 字符表示为多字节字符。如果数据文件使用 UTF-8 字符集进行编码,则不能将高阶 ASCII 字符指定为选项值。

    此外,如果指定高阶 ASCII 字符,建议将文件格式选项设置为 ENCODING = 'string' 数据文件的字符编码,以确保正确解释该字符。

默认值:

反斜杠 (\\)

TRIM_SPACE = TRUE | FALSE

布尔,指定是否从字段中移除空格。

例如,如果您的外部数据库软件将字段放在引号中,但插入了前导空格,则 Snowflake 会读取前导空格而不是左引号字符作为字段的开头(即引号被解释为字段数据字符串的一部分)。使用该选项可在数据加载过程中移除不需要的空格。

再举一个例子,如果字符串两边的引号两边有前导空格或尾随空格,则可以使用 TRIM_SPACE 选项移除周围的空格,并使用 FIELD_OPTIONALLY_ENCLOSED_BY 选项移除引号字符。请注意,引号 的任何空格都将保留。

例如,假设字段分隔符为 |FIELD_OPTIONALLY_ENCLOSED_BY = '"'

|"Hello world"|
|" Hello world "|
| "Hello world" |
Copy

变为:

+---------------+
| C1            |
|----+----------|
| Hello world   |
|  Hello world  |
| Hello world   |
+---------------+
Copy

默认:FALSE

FIELD_OPTIONALLY_ENCLOSED_BY = 'character' | NONE

用于包围字符串的字符。值可以是 NONE、单引号字符 (') 或双引号字符 (")。要使用单引号字符,请使用八进制或十六进制表示形式 (0x27) 或双单引号转义 ('')。

默认:NONE

NULL_IF = ( 'string1' [ , 'string2' ... ] )

用于与 SQL NULL 相互转换的字符串。Snowflake 会将数据加载源中的这些字符串替换为 SQL NULL。若要指定多个字符串,请将字符串列表放在括号中,并使用逗号分隔每个值。

请注意,无论数据类型如何,Snowflake 都会将该值的所有实例转换为 NULL。例如,如果 2 指定为值,则转换为字符串或数字的所有 2 实例。

例如:

NULL_IF = ('\N', 'NULL', 'NUL', '')

请注意,此选项可以包含空字符串。

默认:\N`(即 NULL,假设 :code:`ESCAPE_UNENCLOSED_FIELD 值为 ``\``(默认))

ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE | FALSE

布尔值,指定在输入数据文件中的分隔列数(即字段)与相应表中的列数不匹配时是否生成解析错误。

如果设置为 FALSE,则不会生成错误,并且加载将继续。如果文件已成功加载:

  • 如果输入文件包含的记录字段数多于表中的列数,则匹配的字段将按文件中的出现顺序加载,其余字段将不加载。

  • 如果输入文件包含的记录字段数少于表中的列数,则表中不匹配的列将加载 NULL 值。

此选项假定输入文件中的所有记录长度相同(也就是说,如果文件中包含不同长度的记录,无论为该选项指定的值是多少,都会返回错误)。

默认:TRUE

备注

在加载期间转换数据时 (即使用查询作为 COPY INTO <table> 命令的源),此选项将被忽略。您的数据文件不需要与目标表具有相同的列数和顺序。

REPLACE_INVALID_CHARACTERS = TRUE | FALSE

布尔,指定是否将无效的 UTF-8 字符替换为 Unicode 替换字符 ()。此复制选项执行一对一的字符替换。

如果设置为 TRUE,Snowflake 会将无效的 UTF-8 字符替换为 Unicode 替换字符。

如果设置为 FALSE,则加载操作在检测到无效的 UTF-8 字符编码时产生错误。

默认:FALSE

EMPTY_FIELD_AS_NULL = TRUE | FALSE

指定是否为输入文件中的空字段插入 SQL NULL 的布尔,空字段由两个连续的分隔符(例如 ,,)表示。

如果设置为 FALSE,Snowflake 会尝试将空字段转换为相应列类型。空字符串会插入到类型为 STRING 的列中。对于其他列类型,COPY INTO <table> 命令会产生错误。

默认:TRUE

SKIP_BYTE_ORDER_MARK = TRUE | FALSE

布尔,指定如果数据文件中存在 BOM(字节顺序标记),是否跳过。BOM 是数据文件开头的字符代码,用于定义字节顺序和编码形式。

如果设置为 FALSE,Snowflake 会识别数据文件中的任何 BOM,这可能会导致 BOM 错误或合并到表中的第一列中。

默认:TRUE

ENCODING = 'string'

用于指定源数据的字符集的字符串(常量)。

字符 集

ENCODING 值

支持的语言

备注

Big5

BIG5

繁体中文

EUC-JP

EUCJP

日语

EUC-KR

EUCKR

韩语

GB18030

GB18030

中文

IBM420

IBM420

阿拉伯语

IBM424

IBM424

希伯来语

IBM949

IBM949

韩语

ISO-2022-CN

ISO2022CN

简体中文

ISO-2022-JP

ISO2022JP

日语

ISO-2022-KR

ISO2022KR

韩语

ISO-8859-1

ISO88591

丹麦语、荷兰语、英语、法语、德语、意大利语、挪威语、葡萄牙语、瑞典语

ISO-8859-2

ISO88592

捷克语、匈牙利语、波兰语、罗马尼亚语

ISO-8859-5

ISO88595

俄语

ISO-8859-6

ISO88596

阿拉伯语

ISO-8859-7

ISO88597

希腊语

ISO-8859-8

ISO88598

希伯来语

ISO-8859-9

ISO88599

土耳其语

ISO-8859-15

ISO885915

丹麦语、荷兰语、英语、法语、德语、意大利语、挪威语、葡萄牙语、瑞典语

与 ISO-8859-1 相同,但 8 个字符除外,包括欧元货币符号。

KOI8-R

KOI8R

俄语

Shift_JIS

SHIFTJIS

日语

UTF-8

UTF8

所有语言

要从分隔文件(CSV、TSV 等)加载数据,默认为 UTF-8。. . 要从所有其他支持的文件格式(JSON、Avro 等)加载数据以及卸载数据,UTF-8 是唯一支持的字符集。

UTF-16

UTF16

所有语言

UTF-16BE

UTF16BE

所有语言

UTF-16LE

UTF16LE

所有语言

UTF-32

UTF32

所有语言

UTF-32BE

UTF32BE

所有语言

UTF-32LE

UTF32LE

所有语言

windows-949

WINDOWS949

韩语

windows-1250

WINDOWS1250

捷克语、匈牙利语、波兰语、罗马尼亚语

windows-1251

WINDOWS1251

俄语

windows-1252

WINDOWS1252

丹麦语、荷兰语、英语、法语、德语、意大利语、挪威语、葡萄牙语、瑞典语

windows-1253

WINDOWS1253

希腊语

windows-1254

WINDOWS1254

土耳其语

windows-1255

WINDOWS1255

希伯来语

windows-1256

WINDOWS1256

阿拉伯语

默认:UTF8

备注

Snowflake 将所有数据存储在 UTF-8 字符集中。数据在加载到 Snowflake 之前将转换为 UTF-8。

TYPE = JSON

COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE

字符串(常量)可用于指定要加载的数据文件的当前压缩算法。Snowflake 使用此选项来检测 已压缩 数据文件的压缩方式,以便提取文件中的压缩数据进行加载。

支持的值

备注

AUTO

压缩算法会自动检测,但 Brotli 压缩文件除外(目前无法自动检测)。如果加载 Brotli 压缩的文件,请显式使用 BROTLI 而不是 AUTO

GZIP

BZ2

BROTLI

ZSTD

DEFLATE

使用 Deflate 压缩的文件(带有 zlib 标头、RFC1950)。

RAW_DEFLATE

使用 Raw Deflate 压缩的文件(无标头、RFC1951)。

NONE

表示用于加载数据的文件尚未压缩。

默认:AUTO

DATE_FORMAT = 'string' | AUTO

定义数据文件中日期字符串值的格式。如果未指定值或值为 AUTO,则使用 DATE_INPUT_FORMAT 参数的值。

此文件格式选项仅适用于以下操作:

  • 使用 MATCH_BY_COLUMN_NAME 复制选项将 JSON 数据加载到单独的列中。

  • 通过在 COPY 语句中指定查询(即 COPY 转换),将 JSON 数据加载到单独的列中。

默认:AUTO

TIME_FORMAT = 'string' | AUTO

定义数据文件中时间字符串值的格式。如果未指定值或值为 AUTO,则使用 TIME_INPUT_FORMAT 参数的值。

此文件格式选项仅适用于以下操作:

  • 使用 MATCH_BY_COLUMN_NAME 复制选项将 JSON 数据加载到单独的列中。

  • 通过在 COPY 语句中指定查询(即 COPY 转换),将 JSON 数据加载到单独的列中。

默认:AUTO

TIMESTAMP_FORMAT = string' | AUTO

定义数据文件中时间戳字符串值的格式。如果未指定值或值为 AUTO,则使用 TIMESTAMP_INPUT_FORMAT 参数的值。

此文件格式选项仅适用于以下操作:

  • 使用 MATCH_BY_COLUMN_NAME 复制选项将 JSON 数据加载到单独的列中。

  • 通过在 COPY 语句中指定查询(即 COPY 转换),将 JSON 数据加载到单独的列中。

默认:AUTO

BINARY_FORMAT = HEX | BASE64 | UTF8

定义数据文件中二进制字符串值的编码格式。将数据加载到表中的二进制列时可以使用该选项。

此文件格式选项仅适用于以下操作:

  • 使用 MATCH_BY_COLUMN_NAME 复制选项将 JSON 数据加载到单独的列中。

  • 通过在 COPY 语句中指定查询(即 COPY 转换),将 JSON 数据加载到单独的列中。

默认:HEX

TRIM_SPACE = TRUE | FALSE

布尔,指定是否从字符串中移除前导和尾随空格。

例如,如果您的外部数据库软件将字段放在引号中,但插入了前导空格,则 Snowflake 会读取前导空格而不是左引号字符作为字段的开头(即引号被解释为字段数据字符串的一部分)。可将选项设置为 TRUE,在数据加载期间移除不需要的空格。

仅当使用 MATCH_BY_COLUMN_NAME 复制选项将 JSON 数据加载到单独的列中时,此文件格式选项才应用于以下操作。

默认:FALSE

NULL_IF = ( 'string1' [ , 'string2' , ... ] )

用于与 SQL NULL 相互转换的字符串。Snowflake 会将数据加载源中的这些字符串替换为 SQL NULL。若要指定多个字符串,请将字符串列表放在括号中,并使用逗号分隔每个值。

仅当使用 MATCH_BY_COLUMN_NAME 复制选项将 JSON 数据加载到单独的列中时,此文件格式选项才应用于以下操作。

请注意,无论数据类型如何,Snowflake 都会将该值的所有实例转换为 NULL。例如,如果 2 指定为值,则转换为字符串或数字的所有 2 实例。

例如:

NULL_IF = ('\N', 'NULL', 'NUL', '')

请注意,此选项可以包含空字符串。

默认:\\N``(即 NULL,假设 :code:`ESCAPE_UNENCLOSED_FIELD` 值为 ``\\

ENABLE_OCTAL = TRUE | FALSE

布尔,支持解析八进制数。

默认:FALSE

ALLOW_DUPLICATE = TRUE | FALSE

布尔,允许重复对象字段名称(仅保留最后一个)。

默认:FALSE

STRIP_OUTER_ARRAY = TRUE | FALSE

布尔,指示 JSON 解析器移除外括号 [ ]

默认:FALSE

STRIP_NULL_VALUES = TRUE | FALSE

布尔,指示 JSON 解析器移除包含 null 值的对象字段或数组元素。例如,当设置为 TRUE 时,会发生以下变化:

之前

之后

[null]

[]

[null,null,3]

[,,3]

{"a":null,"b":null,"c":123}

{"c":123}

{"a":[1,null,2],"b":{"x":null,"y":88}}

{"a":[1,,2],"b":{"y":88}}

默认:FALSE

REPLACE_INVALID_CHARACTERS = TRUE | FALSE

布尔,指定是否将无效的 UTF-8 字符替换为 Unicode 替换字符 ()。此复制选项执行一对一的字符替换。

如果设置为 TRUE,Snowflake 会将无效的 UTF-8 字符替换为 Unicode 替换字符。

如果设置为 FALSE,则加载操作在检测到无效的 UTF-8 字符编码时产生错误。

默认:FALSE

IGNORE_UTF8_ERRORS = TRUE | FALSE

布尔,指定 UTF-8 编码错误是否产生错误条件。它是 REPLACE_INVALID_CHARACTERS 的替代语法。

如果设置为 TRUE,则任何无效 UTF-8 的序列都将以静默方式替换为 Unicode 字符 ``U+FFFD``(即“替换字符”)。

如果设置为 FALSE,则加载操作在检测到无效的 UTF-8 字符编码时产生错误。

默认:FALSE

SKIP_BYTE_ORDER_MARK = TRUE | FALSE

布尔,指定是否跳过输入文件中存在的任何 BOM(字节顺序标记)。BOM 是数据文件开头的字符代码,用于定义字节顺序和编码形式。

如果设置为 FALSE,Snowflake 会识别数据文件中的任何 BOM,这可能会导致 BOM 错误或合并到表中的第一列中。

默认:TRUE

TYPE = AVRO

COMPRESSION = AUTO | GZIP | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE

字符串(常量)可用于指定要加载的数据文件的当前压缩算法。Snowflake 使用此选项来检测 已压缩 数据文件的压缩方式,以便提取文件中的压缩数据进行加载。

支持的值

备注

AUTO

压缩算法会自动检测,但 Brotli 压缩文件除外(目前无法自动检测)。如果加载 Brotli 压缩的文件,请显式使用 BROTLI 而不是 AUTO

GZIP

BROTLI

ZSTD

DEFLATE

使用 Deflate 压缩的文件(带有 zlib 标头、RFC1950)。

RAW_DEFLATE

使用 Raw Deflate 压缩的文件(无标头、RFC1951)。

NONE

要加载的数据文件尚未压缩。

默认:AUTO

备注

我们建议您使用默认 AUTO 选项,因为它将确定文件和编解码器压缩。指定压缩选项是指对文件进行压缩,而不是对块(编解码器)进行压缩。

TRIM_SPACE = TRUE | FALSE

布尔,指定是否从字符串中移除前导和尾随空格。

例如,如果您的外部数据库软件将字段放在引号中,但插入了前导空格,则 Snowflake 会读取前导空格而不是左引号字符作为字段的开头(即引号被解释为字段数据字符串的一部分)。可将选项设置为 TRUE,在数据加载期间移除不需要的空格。

仅当使用 MATCH_BY_COLUMN_NAME 复制选项将 Avro 数据加载到单独的列中时,此文件格式选项才应用于以下操作。

默认:FALSE

REPLACE_INVALID_CHARACTERS = TRUE | FALSE

布尔,指定是否将无效的 UTF-8 字符替换为 Unicode 替换字符 ()。此复制选项执行一对一的字符替换。

如果设置为 TRUE,Snowflake 会将无效的 UTF-8 字符替换为 Unicode 替换字符。

如果设置为 FALSE,则加载操作在检测到无效的 UTF-8 字符编码时产生错误。

默认:FALSE

NULL_IF = ( 'string1' [ , 'string2' , ... ] )

用于与 SQL NULL 相互转换的字符串。Snowflake 会将数据加载源中的这些字符串替换为 SQL NULL。若要指定多个字符串,请将字符串列表放在括号中,并使用逗号分隔每个值。

仅当使用 MATCH_BY_COLUMN_NAME 复制选项将 Avro 数据加载到单独的列中时,此文件格式选项才应用于以下操作。

请注意,无论数据类型如何,Snowflake 都会将该值的所有实例转换为 NULL。例如,如果 2 指定为值,则转换为字符串或数字的所有 2 实例。

例如:

NULL_IF = ('\N', 'NULL', 'NUL', '')

请注意,此选项可以包含空字符串。

默认:\\N``(即 NULL,假设 :code:`ESCAPE_UNENCLOSED_FIELD` 值为 ``\\

TYPE = ORC

TRIM_SPACE = TRUE | FALSE

布尔,指定是否从字符串中移除前导和尾随空格。

例如,如果您的外部数据库软件将字段放在引号中,但插入了前导空格,则 Snowflake 会读取前导空格而不是左引号字符作为字段的开头(即引号被解释为字段数据字符串的一部分)。可将选项设置为 TRUE,在数据加载期间移除不需要的空格。

仅当使用 MATCH_BY_COLUMN_NAME 复制选项将 Orc 数据加载到单独的列中时,此文件格式选项才应用于以下操作。

默认:FALSE

REPLACE_INVALID_CHARACTERS = TRUE | FALSE

布尔,指定是否将无效的 UTF-8 字符替换为 Unicode 替换字符 ()。此复制选项执行一对一的字符替换。

如果设置为 TRUE,Snowflake 会将无效的 UTF-8 字符替换为 Unicode 替换字符。

如果设置为 FALSE,则加载操作在检测到无效的 UTF-8 字符编码时产生错误。

默认:FALSE

NULL_IF = ( 'string1' [ , 'string2' , ... ] )

用于与 SQL NULL 相互转换的字符串。Snowflake 会将数据加载源中的这些字符串替换为 SQL NULL。若要指定多个字符串,请将字符串列表放在括号中,并使用逗号分隔每个值。

仅当使用 MATCH_BY_COLUMN_NAME 复制选项将 Orc 数据加载到单独的列中时,此文件格式选项才应用于以下操作。

请注意,无论数据类型如何,Snowflake 都会将该值的所有实例转换为 NULL。例如,如果 2 指定为值,则转换为字符串或数字的所有 2 实例。

例如:

NULL_IF = ('\N', 'NULL', 'NUL', '')

请注意,此选项可以包含空字符串。

默认:\\N``(即 NULL,假设 :code:`ESCAPE_UNENCLOSED_FIELD` 值为 ``\\

TYPE = PARQUET

COMPRESSION = AUTO | SNAPPY | NONE

字符串(常量)可用于指定要加载的数据文件的当前压缩算法。Snowflake 使用此选项来检测 已压缩 数据文件的压缩方式,以便提取文件中的压缩数据进行加载。

支持的值

备注

AUTO

自动检测压缩算法。支持以下压缩算法:Brotli、gzip、Lempel-Ziv-Oberhumer (LZO)、LZ4、Snappy 或 Zstandard v0.8(及更高版本)。

SNAPPY

NONE

要加载的数据文件尚未压缩。

BINARY_AS_TEXT = TRUE | FALSE

布尔,指定是否将未定义逻辑数据类型的列解释为 UTF-8 文本。当设置为 FALSE 时,Snowflake 会将这些列解释为二进制数据。

默认:TRUE

备注

Snowflake 建议您将 BINARY_AS_TEXT 设置为 FALSE 以避免任何潜在的转换问题。

TRIM_SPACE = TRUE | FALSE

布尔,指定是否从字符串中移除前导和尾随空格。

例如,如果您的外部数据库软件将字段放在引号中,但插入了前导空格,则 Snowflake 会读取前导空格而不是左引号字符作为字段的开头(即引号被解释为字段数据字符串的一部分)。可将选项设置为 TRUE,在数据加载期间移除不需要的空格。

仅当使用 MATCH_BY_COLUMN_NAME 复制选项将 Parquet 数据加载到单独的列中时,此文件格式选项才应用于以下操作。

默认:FALSE

USE_LOGICAL_TYPE = TRUE | FALSE

布尔,指定是否使用 Parquet 逻辑类型。使用此文件格式选项,Snowflake 可以在数据加载期间解释 Parquet 逻辑类型。有关更多信息,请参阅 Parquet 逻辑类型定义 (https://github.com/apache/parquet-format/blob/master/LogicalTypes.md)。创建新文件格式选项时,若要启用 Parquet 逻辑类型,请将 USE_LOGICAL_TYPE 设置为 TRUE。

默认:FALSE

REPLACE_INVALID_CHARACTERS = TRUE | FALSE

布尔,指定是否将无效的 UTF-8 字符替换为 Unicode 替换字符 ()。此复制选项执行一对一的字符替换。

如果设置为 TRUE,Snowflake 会将无效的 UTF-8 字符替换为 Unicode 替换字符。

如果设置为 FALSE,则加载操作在检测到无效的 UTF-8 字符编码时产生错误。

默认:FALSE

NULL_IF = ( 'string1' [ , 'string2' , ... ] )

用于与 SQL NULL 相互转换的字符串。Snowflake 会将数据加载源中的这些字符串替换为 SQL NULL。若要指定多个字符串,请将字符串列表放在括号中,并使用逗号分隔每个值。

仅当使用 MATCH_BY_COLUMN_NAME 复制选项将 Parquet 数据加载到单独的列中时,此文件格式选项才应用于以下操作。

请注意,无论数据类型如何,Snowflake 都会将该值的所有实例转换为 NULL。例如,如果 2 指定为值,则转换为字符串或数字的所有 2 实例。

例如:

NULL_IF = ('\N', 'NULL', 'NUL', '')

请注意,此选项可以包含空字符串。

默认:\\N``(即 NULL,假设 :code:`ESCAPE_UNENCLOSED_FIELD` 值为 ``\\

TYPE = XML

COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE

字符串(常量)可用于指定要加载的数据文件的当前压缩算法。Snowflake 使用此选项来检测 已压缩 数据文件的压缩方式,以便提取文件中的压缩数据进行加载。

支持的值

备注

AUTO

压缩算法会自动检测,但 Brotli 压缩文件除外(目前无法自动检测)。如果加载 Brotli 压缩的文件,请显式使用 BROTLI 而不是 AUTO

GZIP

BZ2

BROTLI

ZSTD

DEFLATE

使用 Deflate 压缩的文件(带有 zlib 标头、RFC1950)。

RAW_DEFLATE

使用 Raw Deflate 压缩的文件(无标头、RFC1951)。

NONE

要加载的数据文件尚未压缩。

默认:AUTO

IGNORE_UTF8_ERRORS = TRUE | FALSE

布尔,指定 UTF-8 编码错误是否产生错误条件。它是 REPLACE_INVALID_CHARACTERS 的替代语法。

如果设置为 TRUE,则任何无效 UTF-8 的序列都将以静默方式替换为 Unicode 字符 ``U+FFFD``(即“替换字符”)。

如果设置为 FALSE,则加载操作在检测到无效的 UTF-8 字符编码时产生错误。

默认:FALSE

PRESERVE_SPACE = TRUE | FALSE

布尔,指定 XML 分析器是否在元素内容中保留前导空格和尾随空格。

默认:FALSE

STRIP_OUTER_ELEMENT = TRUE | FALSE

布尔,指定 XML 解析器是否剥离外部 XML 元素,将第 2 级元素公开为单独的文档。

默认:FALSE

DISABLE_SNOWFLAKE_DATA = TRUE | FALSE

布尔,指定 XML 分析器是否禁用对 Snowflake 半结构化数据标记的识别。

默认:FALSE

DISABLE_AUTO_CONVERT = TRUE | FALSE

布尔,指定 XML 分析器是否禁用数值和布尔值从文本到原生表示形式的自动转换。

默认:FALSE

REPLACE_INVALID_CHARACTERS = TRUE | FALSE

布尔,指定是否将无效的 UTF-8 字符替换为 Unicode 替换字符 ()。此复制选项执行一对一的字符替换。

如果设置为 TRUE,Snowflake 会将无效的 UTF-8 字符替换为 Unicode 替换字符。

如果设置为 FALSE,则加载操作在检测到无效的 UTF-8 字符编码时产生错误。

默认:FALSE

SKIP_BYTE_ORDER_MARK = TRUE | FALSE

布尔,指定是否跳过输入文件中存在的任何 BOM(字节顺序标记)。BOM 是数据文件开头的字符代码,用于定义字节顺序和编码形式。

如果设置为 FALSE,Snowflake 会识别数据文件中的任何 BOM,这可能会导致 BOM 错误或合并到表中的第一列中。

默认:TRUE

复制选项 (copyOptions)

您可以指定以下一个或多个复制选项(用空格、逗号或换行符分隔):

ON_ERROR = CONTINUE | SKIP_FILE | SKIP_FILE_num | 'SKIP_FILE_num%' | ABORT_STATEMENT
使用:

仅加载数据

定义:

字符串(常量),指定加载操作的错误处理。

重要

仔细考虑 ON_ERROR 复制选项值。默认值在常见方案中是合适的,但并不总是最佳选项。

:
  • CONTINUE

    如果发现错误,请继续加载文件。COPY 语句返回一条错误消息,每个数据文件最多发现一个错误。

    请注意,ROWS_PARSED 和 ROWS_LOADED 列值之间的差值表示包含检测到的错误的行数。但是,这些行中的每一行都可能包含多个错误。若要查看数据文件中的所有错误,请使用 VALIDATION_MODE 参数或查询 VALIDATE 函数。

  • SKIP_FILE

    发现错误时跳过文件。

    请注意,无论是否发现错误,SKIP_FILE 操作都会缓冲整个文件。因此,SKIP_FILECONTINUEABORT_STATEMENT 慢。由于少量错误而跳过大文件可能会导致延迟和浪费 Credit。当从没有逻辑描述的文件加载大量记录时(例如,文件是以粗略的时间间隔自动生成的),请考虑指定 CONTINUE

    其他模式:

    SKIP_FILE_num`(例如 :code:`SKIP_FILE_10

    当文件中找到的错误行数等于或超过指定数时,跳过文件。

    'SKIP_FILE_num%'`(例如 :code:'SKIP_FILE_10%'`

    当文件中找到的错误行的百分比超过指定的百分比时,跳过文件。

  • ABORT_STATEMENT

    如果在数据文件中发现任何错误,请中止加载操作。

    请注意,如果找不到数据文件(例如,因为它不存在或无法访问),则加载操作 不会 中止,除非找不到 FILES 参数中显式指定的数据文件。

默认值:
使用 COPY 批量加载:

ABORT_STATEMENT

Snowpipe:

SKIP_FILE

SIZE_LIMIT = num
定义:

数字 (> 0),指定要为给定 COPY 语句加载的最大数据大小(以字节为单位)。当超过阈值时,COPY 操作将停止加载文件。此选项通常用于使用多个 COPY 语句加载一组通用文件。对于每个语句,数据加载将继续进行,直到超过指定的 SIZE_LIMIT 值,然后再转到下一个语句。

例如,假设暂存区路径中的一组文件大小为 10 MB。如果多个 COPY 语句将 SIZE_LIMIT 设置为 25000000 (25 MB),则每个语句将加载 3 个文件。也就是说,每个 COPY 操作将在超过 SIZE_LIMIT 阈值后停止。

请注意,除非没有要加载的文件,否则无论指定的 SIZE_LIMIT 值如何,都至少加载一个文件。

默认值:

null(无大小限制)

PURGE = TRUE | FALSE
定义:

布尔,指定是否在成功加载数据后自动从暂存区中移除数据文件。

如果此选项设置为 TRUE,请注意,将尽最大努力移除已成功加载的数据文件。如果清除操作因任何原因失败,则当前不会返回任何错误。我们建议您定期(使用 LIST)列出暂存文件,并手动移除成功加载的文件(如果存在)。

默认值:

FALSE

RETURN_FAILED_ONLY = TRUE | FALSE
定义:

布尔,指定是否仅返回语句结果中加载失败的文件。

默认值:

FALSE

MATCH_BY_COLUMN_NAME = CASE_SENSITIVE | CASE_INSENSITIVE | NONE
定义:

字符串,指定是否将半结构化数据加载到目标表中与数据中表示的相应列匹配的列中。

重要

在所有情况下,请勿同时使用 MATCH_BY_COLUMN_NAME 复制选项和 SELECT 语句在加载期间转换数据。这两个选项仍然可以单独使用,但不能一起使用。如果尝试一起使用,则会导致以下错误:SQL compilation error: match_by_column_name is not supported with copy transform.

例如,不允许使用以下语法:

COPY INTO [<namespace>.]<table_name> [ ( <col_name> [ , <col_name> ... ] ) ]
FROM ( SELECT [<alias>.]$<file_col_num>[.<element>] [ , [<alias>.]$<file_col_num>[.<element>] ... ]
    FROM { internalStage | externalStage } )
[ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ]
[ PATTERN = '<regex_pattern>' ]
[ FILE_FORMAT = ( { FORMAT_NAME = '[<namespace>.]<file_format_name>' |
            TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
MATCH_BY_COLUMN_NAME = CASE_SENSITIVE | CASE_INSENSITIVE | NONE
[ other copyOptions ]
Copy

有关详细信息,请参阅 加载期间转换数据

以下数据格式支持此复制选项:

  • JSON

  • Avro

  • ORC

  • Parquet

  • CSV

要使列匹配,必须满足以下条件:

  • 数据中表示的列必须与表中的列 同名。复制选项支持列名区分大小写。列顺序无关紧要。

  • 表中的列必须具有与数据中表示的列中的值兼容的数据类型。例如,字符串、数字和布尔都可以加载到变体列中。

:
CASE_SENSITIVE | CASE_INSENSITIVE

将半结构化数据加载到目标表中与数据中表示的相应列匹配的列中。列名区分大小写 (CASE_SENSITIVE) 或不区分大小写 (CASE_INSENSITIVE)。

COPY 操作验证目标表中至少有一列与数据文件中表示的列匹配。如果找到匹配项,则数据文件中的值将加载到一个或多个列中。如果未找到匹配项,则将文件中每条记录的一组 NULL 值加载到表中。

备注

  • 如果数据文件中存在其他不匹配的列,则不会加载这些列中的值。

  • 如果目标表中存在其他不匹配的列,则 COPY 操作会将 NULL 值插入到这些列中。这些列必须支持 NULL 值。

NONE

COPY 操作将半结构化数据加载到变体列中,或者,如果 COPY 语句中包含查询,则转换数据。

默认值:

NONE

备注

目前存在以下限制:

  • MATCH_BY_COLUMN_NAME 不能与 COPY 语句中的 VALIDATION_MODE 参数一起使用,以验证暂存数据,而不是将其加载到目标表中。

  • 仅限 Parquet 数据。`当 MATCH_BY_COLUMN_NAME 设置为 :samp:`CASE_SENSITIVECASE_INSENSITIVE 时,空列值(例如 "col1": "")会产生错误。

INCLUDE_METADATA = ( column_name = METADATA$field [ , column_name = METADATA$field ... ] )
定义:

目标表的现有列与其 METADATA$ 列之间的用户定义映射。此复制选项只能与 MATCH_BY_COLUMN_NAME 复制选项一起使用。 METADATA$field 的有效输入包括以下内容:

  • METADATA$FILENAME

  • METADATA$FILE_ROW_NUMBER

  • METADATA$FILE_CONTENT_KEY

  • METADATA$FILE_LAST_MODIFIED

  • METADATA$START_SCAN_TIME

有关元数据列的详细信息,请参阅 查询暂存文件的元数据

当使用此复制选项定义映射时,列 column_name 使用指定的元数据值填充,如以下示例所示:

COPY INTO table1 FROM @stage1
MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE
INCLUDE_METADATA = (
    ingestdate = METADATA$START_SCAN_TIME, filename = METADATA$FILENAME);
Copy
+-----+-----------------------+---------------------------------+-----+
| ... | FILENAME              | INGESTDATE                      | ... |
|---------------------------------------------------------------+-----|
| ... | example_file.json.gz  | Thu, 22 Feb 2024 19:14:55 +0000 | ... |
+-----+-----------------------+---------------------------------+-----+
默认值:

NULL

备注

  • INCLUDE_METADATA 目标列名称必须首先存在于表中。如果目标列名称不存在,则不会自动添加。

  • 使用 INCLUDE_METADATA 列的唯一列名称。如果 INCLUDE_METADATA 目标列与数据文件中的列名称冲突,INCLUDE_METADATA 定义的 METADATA$ 值优先。

ENFORCE_LENGTH = TRUE | FALSE
定义:

具有反向逻辑的 TRUNCATECOLUMNS 替代语法(用于与其他系统兼容)

布尔,指定是否截断超过目标列长度的文本字符串:

  • 如果为 TRUE,COPY 语句将在加载的字符串超过目标列长度时生成错误。

  • 如果为 FALSE,则会将字符串自动截断为目标列长度。

此复制选项支持 CSV 数据,以及加载到关系表中的单独列中的半结构化数据中的字符串值。

默认值:

TRUE

备注

  • 如果目标字符串列的长度设置为最大值(例如 VARCHAR (16777216)),传入字符串不能超过此长度;否则,COPY 命令将产生错误。

  • 此参数在功能上等效于 TRUNCATECOLUMNS,但具有相反的行为。提供它是为了与其他数据库兼容。只需在 COPY 语句中包含这两个参数之一即可生成所需的输出。

TRUNCATECOLUMNS = TRUE | FALSE
定义:

具有反向逻辑的 ENFORCE_LENGTH 替代语法(用于与其他系统兼容)

布尔,指定是否截断超过目标列长度的文本字符串:

  • 如果为 TRUE,则会将字符串自动截断为目标列长度。

  • 如果为 FALSE,COPY 语句将在加载的字符串超过目标列长度时生成错误。

此复制选项支持 CSV 数据,以及加载到关系表中的单独列中的半结构化数据中的字符串值。

默认值:

FALSE

备注

  • 如果目标字符串列的长度设置为最大值(例如 VARCHAR (16777216)),传入字符串不能超过此长度;否则,COPY 命令将产生错误。

  • 此参数在功能上等效于 ENFORCE_LENGTH,但具有相反的行为。提供它是为了与其他数据库兼容。只需在 COPY 语句中包含这两个参数之一即可生成所需的输出。

FORCE = TRUE | FALSE
定义:

布尔,指定加载所有文件,无论这些文件以前是否已加载,并且自加载以来未更改。请注意,此选项会重新加载文件,可能会复制表中的数据。

默认值:

FALSE

LOAD_UNCERTAIN_FILES = TRUE | FALSE
定义:

布尔,指定加载加载状态未知的文件。默认情况下,COPY 命令会跳过这些文件。

如果满足以下 所有 条件,则加载状态为未知:

  • 文件的 LAST_MODIFIED 日期(即暂存文件的日期)早于 64 天。

  • 初始数据集在 64 天前加载到表中。

  • 如果文件已成功加载到表中,则此事件发生在 64 天前。

若要强制执行 COPY 命令加载所有文件,而不管加载状态是否已知,请改用 FORCE 选项。

有关负载状态不确定性的详细信息,请参阅 加载较旧的文件

默认值:

FALSE

使用说明

  • 不完全支持 SELECT 语句中的 DISTINCT 关键字。指定关键字可能会导致不一致或意外的 ON_ERROR 复制选项行为。

  • 仅从 Google Cloud Storage 加载: 针对外部暂存区返回的对象列表可包括一个或多个“目录 blob”;实际上,是以正斜杠字符 (/) 结尾的路径,例如:

    LIST @my_gcs_stage;
    
    +---------------------------------------+------+----------------------------------+-------------------------------+
    | name                                  | size | md5                              | last_modified                 |
    |---------------------------------------+------+----------------------------------+-------------------------------|
    | my_gcs_stage/load/                    |  12  | 12348f18bcb35e7b6b628ca12345678c | Mon, 11 Sep 2019 16:57:43 GMT |
    | my_gcs_stage/load/data_0_0_0.csv.gz   |  147 | 9765daba007a643bdff4eae10d43218y | Mon, 11 Sep 2019 18:13:07 GMT |
    +---------------------------------------+------+----------------------------------+-------------------------------+
    
    Copy

    这些 blob 是在 Google Cloud Platform 控制台中创建目录时列出的,不使用 Google 提供的任何其他工具。

    当对象列表包含目录 blob 时,引用暂存区的 COPY 语句可能会失败。为了避免错误,当暂存区的文件列表包含目录 blob 时,我们建议使用文件模式匹配来识别要包含的文件(即 PATTERN 子句)。有关示例,请参阅 使用模式匹配加载 (本主题内容)。或者,在 COPY 语句中设置 ON_ERROR = SKIP_FILE。

  • 仅当您直接从专用/受保护的存储位置加载时,STORAGE_INTEGRATIONCREDENTIALSENCRYPTION 才适用:

    • 如果从公有桶加载,则不需要安全访问。

    • 如果从指定的外部暂存区加载,则该暂存区将提供访问桶所需的所有凭据信息。

  • 如果在运行 COPY 命令时遇到错误,则在命令完成后,可以使用 VALIDATE 表函数验证产生错误的文件。

    备注

    VALIDATE 函数仅返回用于执行标准数据加载的 COPY 命令的输出;该函数并不支持在数据加载期间执行转换的 COPY 命令(例如,加载数据列的子集或重新排序数据列)。

  • 除非显式指定 FORCE = TRUE 为复制选项之一,否则该命令将忽略已加载到表中的暂存数据文件。若要重新加载数据,必须指定 FORCE = TRUE 或修改文件,并再次将其暂存,这将生成新的校验和。

  • COPY 命令不验证 Parquet 文件的数据类型转换。

输出

该命令返回以下列:

列名称

数据类型

描述

FILE

TEXT

源文件的名称和文件的相对路径

STATUS

TEXT

状态:已加载、加载失败或部分加载

ROWS_PARSED

NUMBER

从源文件解析的行数

ROWS_LOADED

NUMBER

从源文件加载的行数

ERROR_LIMIT

NUMBER

如果错误数达到此限制,则中止

ERRORS_SEEN

NUMBER

源文件中的错误行数

FIRST_ERROR

TEXT

源文件的第一个错误

FIRST_ERROR_LINE

NUMBER

第一个错误的行号

FIRST_ERROR_CHARACTER

NUMBER

第一个错误字符的位置

FIRST_ERROR_COLUMN_NAME

TEXT

第一个错误的列名

示例

有关数据加载转换的示例,请参阅 在加载期间转换数据

从内部暂存区加载文件

备注

这些示例假定文件已使用 PUT 命令复制到暂存区。

将文件从命名内部暂存区加载到表中:

COPY INTO mytable
FROM @my_int_stage;
Copy

将文件从表的暂存区加载到表中:

COPY INTO mytable
FILE_FORMAT = (TYPE = CSV);
Copy

备注

从表位置中的文件复制数据时,可以省略 FROM 子句,因为 Snowflake 会自动检查表位置中的文件。

将用户个人暂存区中的文件加载到表中:

COPY INTO mytable from @~/staged
FILE_FORMAT = (FORMAT_NAME = 'mycsv');
Copy

从命名外部暂存区加载文件

从之前使用 CREATE STAGE 命令创建的命名外部暂存区加载文件。命名外部暂存区可引用外部位置(Amazon S3、Google Cloud Storage 或 Microsoft Azure),并包含访问该位置所需的所有凭据和其他详细信息:

COPY INTO mycsvtable
  FROM @my_ext_stage/tutorials/dataloading/contacts1.csv;
Copy

使用列匹配加载文件

使用 MATCH_BY_COLUMN_NAME 复制选项将文件从命名外部暂存区加载到表中,方法是将文件中的列名与表中定义的列名进行匹配(不区分大小写)。使用此选项时,文件的列顺序无需与表的列顺序一致。

COPY INTO mytable
  FROM @my_ext_stage/tutorials/dataloading/sales.json.gz
  FILE_FORMAT = (TYPE = 'JSON')
  MATCH_BY_COLUMN_NAME='CASE_INSENSITIVE';
Copy

直接从外部位置加载文件

以下示例使用命名 my_csv_format 文件格式从存储位置(Amazon S3、Google Cloud Storage 或 Microsoft Azure)加载所有前缀为 data/files 的文件:

Amazon S3

使用名为 myint 的引用存储集成来访问引用的 S3 桶。请注意,这两个示例都会截断 MASTER_KEY 值:

COPY INTO mytable
  FROM s3://mybucket/data/files
  STORAGE_INTEGRATION = myint
  ENCRYPTION=(MASTER_KEY = 'eSx...')
  FILE_FORMAT = (FORMAT_NAME = my_csv_format);
Copy

使用提供的凭据来访问引用的 S3 桶:

COPY INTO mytable
  FROM s3://mybucket/data/files
  CREDENTIALS=(AWS_KEY_ID='$AWS_ACCESS_KEY_ID' AWS_SECRET_KEY='$AWS_SECRET_ACCESS_KEY')
  ENCRYPTION=(MASTER_KEY = 'eSx...')
  FILE_FORMAT = (FORMAT_NAME = my_csv_format);
Copy

Google Cloud Storage

使用名为 myint 的引用存储集成来访问引用的 GCS 桶:

COPY INTO mytable
  FROM 'gcs://mybucket/data/files'
  STORAGE_INTEGRATION = myint
  FILE_FORMAT = (FORMAT_NAME = my_csv_format);
Copy

Microsoft Azure

使用名为 myint 的引用存储集成来访问引用的容器。请注意,这两个示例都会截断 MASTER_KEY 值:

COPY INTO mytable
  FROM 'azure://myaccount.blob.core.windows.net/data/files'
  STORAGE_INTEGRATION = myint
  ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPx...')
  FILE_FORMAT = (FORMAT_NAME = my_csv_format);
Copy

使用提供的凭据来访问引用的容器:

COPY INTO mytable
  FROM 'azure://myaccount.blob.core.windows.net/mycontainer/data/files'
  CREDENTIALS=(AZURE_SAS_TOKEN='?sv=2016-05-31&ss=b&srt=sco&sp=rwdl&se=2018-06-27T10:05:50Z&st=2017-06-27T02:05:50Z&spr=https,http&sig=bgqQwoXwxzuD2GJfagRg7VOS8hzNr3QLT7rhS8OFRLQ%3D')
  ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPx...')
  FILE_FORMAT = (FORMAT_NAME = my_csv_format);
Copy

使用模式匹配加载

将文件从表的暂存区加载到表中,使用模式匹配只加载任何路径下压缩 CSV 文件中的数据:

COPY INTO mytable
  FILE_FORMAT = (TYPE = 'CSV')
  PATTERN='.*/.*/.*[.]csv[.]gz';
Copy

其中 .* 被解释为“出现 0 个或多个任意字符”。方括号转义为文件扩展名前的句点字符 (.)。

使用模式匹配将文件从表暂存区加载到表中,以仅加载名称包含字符串 sales 的未压缩 CSV 文件:

COPY INTO mytable
  FILE_FORMAT = (FORMAT_NAME = myformat)
  PATTERN='.*sales.*[.]csv';
Copy

将 JSON 数据加载到 VARIANT 列中

下面的示例将 JSON 数据加载到具有 VARIANT 类型单列的表中。

暂存的 JSON 数组由三个对象组成,这些对象由换行符分隔:

[{
    "location": {
      "city": "Lexington",
      "zip": "40503",
      },
      "sq__ft": "1000",
      "sale_date": "4-25-16",
      "price": "75836"
},
{
    "location": {
      "city": "Belmont",
      "zip": "02478",
      },
      "sq__ft": "1103",
      "sale_date": "6-18-16",
      "price": "92567"
}
{
    "location": {
      "city": "Winchester",
      "zip": "01890",
      },
      "sq__ft": "1122",
      "sale_date": "1-31-16",
      "price": "89921"
}]
Copy
/* Create a JSON file format that strips the outer array. */

CREATE OR REPLACE FILE FORMAT json_format
  TYPE = 'JSON'
  STRIP_OUTER_ARRAY = TRUE;

/* Create an internal stage that references the JSON file format. */

CREATE OR REPLACE STAGE mystage
  FILE_FORMAT = json_format;

/* Stage the JSON file. */

PUT file:///tmp/sales.json @mystage AUTO_COMPRESS=TRUE;

/* Create a target table for the JSON data. */

CREATE OR REPLACE TABLE house_sales (src VARIANT);

/* Copy the JSON data into the target table. */

COPY INTO house_sales
   FROM @mystage/sales.json.gz;

SELECT * FROM house_sales;

+---------------------------+
| SRC                       |
|---------------------------|
| {                         |
|   "location": {           |
|     "city": "Lexington",  |
|     "zip": "40503"        |
|   },                      |
|   "price": "75836",       |
|   "sale_date": "4-25-16", |
|   "sq__ft": "1000",       |
|   "type": "Residential"   |
| }                         |
| {                         |
|   "location": {           |
|     "city": "Belmont",    |
|     "zip": "02478"        |
|   },                      |
|   "price": "92567",       |
|   "sale_date": "6-18-16", |
|   "sq__ft": "1103",       |
|   "type": "Residential"   |
| }                         |
| {                         |
|   "location": {           |
|     "city": "Winchester", |
|     "zip": "01890"        |
|   },                      |
|   "price": "89921",       |
|   "sale_date": "1-31-16", |
|   "sq__ft": "1122",       |
|   "type": "Condo"         |
| }                         |
+---------------------------+
Copy

重新加载文件

FORCE = TRUE 添加到 COPY 命令中,可从一组未更改(即校验和与首次加载时相同)的暂存数据文件中重新加载(复制)数据。

在下面的示例中,第一条命令加载指定的文件,第二条命令强制再次加载相同的文件(产生重复行),即使文件内容没有改变:

COPY INTO load1 FROM @%load1/data1/
    FILES=('test1.csv', 'test2.csv');

COPY INTO load1 FROM @%load1/data1/
    FILES=('test1.csv', 'test2.csv')
    FORCE=TRUE;
Copy

加载后清除文件

将文件从表的暂存区加载到表中,并在加载后清除文件。默认情况下,COPY 不会从该位置清除已加载的文件。要在加载后清除文件,请执行以下操作:

  • 为表设置 PURGE=TRUE,以指定在加载后清除所有成功加载到表中的文件:

    ALTER TABLE mytable SET STAGE_COPY_OPTIONS = (PURGE = TRUE);
    
    COPY INTO mytable;
    
    Copy
  • 您也可以直接在 COPY 命令中替换任何复制选项:

    COPY INTO mytable PURGE = TRUE;
    
    Copy

验证暂存文件

在不加载的情况下,验证暂存区中的文件:

  • 在验证模式下运行 COPY 命令并查看所有错误:

    COPY INTO mytable VALIDATION_MODE = 'RETURN_ERRORS';
    
    +-------------------------------------------------------------------------------------------------------------------------------+------------------------+------+-----------+-------------+----------+--------+-----------+----------------------+------------+----------------+
    |                                                         ERROR                                                                 |            FILE        | LINE | CHARACTER | BYTE_OFFSET | CATEGORY |  CODE  | SQL_STATE |   COLUMN_NAME        | ROW_NUMBER | ROW_START_LINE |
    +-------------------------------------------------------------------------------------------------------------------------------+------------------------+------+-----------+-------------+----------+--------+-----------+----------------------+------------+----------------+
    | Field delimiter ',' found while expecting record delimiter '\n'                                                               | @MYTABLE/data1.csv.gz  | 3    | 21        | 76          | parsing  | 100016 | 22000     | "MYTABLE"["QUOTA":3] | 3          | 3              |
    | NULL result in a non-nullable column. Use quotes if an empty field should be interpreted as an empty string instead of a null | @MYTABLE/data3.csv.gz  | 3    | 2         | 62          | parsing  | 100088 | 22000     | "MYTABLE"["NAME":1]  | 3          | 3              |
    | End of record reached while expected to parse column '"MYTABLE"["QUOTA":3]'                                                   | @MYTABLE/data3.csv.gz  | 4    | 20        | 96          | parsing  | 100068 | 22000     | "MYTABLE"["QUOTA":3] | 4          | 4              |
    +-------------------------------------------------------------------------------------------------------------------------------+------------------------+------+-----------+-------------+----------+--------+-----------+----------------------+------------+----------------+
    
    Copy
  • 在验证模式下对指定的行数运行 COPY 命令。在此示例中,第一次运行在指定的行数中没有遇到错误,并成功完成,显示的信息与加载到表中时相同。第二次运行在指定的行数中遇到错误,运行失败并显示遇到的错误:

    COPY INTO mytable VALIDATION_MODE = 'RETURN_2_ROWS';
    
    +--------------------+----------+-------+
    |        NAME        |    ID    | QUOTA |
    +--------------------+----------+-------+
    | Joe Smith          |  456111  | 0     |
    | Tom Jones          |  111111  | 3400  |
    +--------------------+----------+-------+
    
    COPY INTO mytable VALIDATION_MODE = 'RETURN_3_ROWS';
    
    FAILURE: NULL result in a non-nullable column. Use quotes if an empty field should be interpreted as an empty string instead of a null
      File '@MYTABLE/data3.csv.gz', line 3, character 2
      Row 3, column "MYTABLE"["NAME":1]
    
    Copy
语言: 中文