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)。
- 另请参阅:
语法¶
/* 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 ]
其中:
internalStage ::= @[<namespace>.]<int_stage_name>[/<path>] | @[<namespace>.]%<table_name>[/<path>] | @~[/<path>]externalStage ::= @[<namespace>.]<ext_stage_name>[/<path>]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' ] ) ]externalLocation (for Google Cloud Storage) ::= 'gcs://<bucket>[/<path>]' [ STORAGE_INTEGRATION = <integration_name> ] [ ENCRYPTION = ( [ TYPE = 'GCS_SSE_KMS' ] [ KMS_KEY_ID = '<string>' ] | [ TYPE = 'NONE' ] ) ]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>' ] ) ]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 | FALSEcopyOptions ::= 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
必填参数¶
[namespace.]table_name
指定将数据加载到的表的名称。
命名空间可以选择以
database_name.schema_name
或schema_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_name
或schema_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 语句中,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' ] )
转换参数¶
( 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
iss3://mybucket/path1/
, then Snowpipe trims/path1/
from the storage location in the FROM clause and applies the regular expression topath2/
中,加上路径中的文件名。批量数据加载操作将正则表达式应用于 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_NAME
和TYPE
是互斥的;在同一条 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_DELIMITER
或RECORD_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" |
变为:
+---------------+ | C1 | |----+----------| | Hello world | | Hello world | | Hello world | +---------------+
默认:
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_FILE
比CONTINUE
或ABORT_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 ]
有关详细信息,请参阅 加载期间转换数据。
以下数据格式支持此复制选项:
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_SENSITIVE 或
CASE_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);
+-----+-----------------------+---------------------------------+-----+ | ... | 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 | +---------------------------------------+------+----------------------------------+-------------------------------+
这些 blob 是在 Google Cloud Platform 控制台中创建目录时列出的,不使用 Google 提供的任何其他工具。
当对象列表包含目录 blob 时,引用暂存区的 COPY 语句可能会失败。为了避免错误,当暂存区的文件列表包含目录 blob 时,我们建议使用文件模式匹配来识别要包含的文件(即 PATTERN 子句)。有关示例,请参阅 使用模式匹配加载 (本主题内容)。或者,在 COPY 语句中设置 ON_ERROR = SKIP_FILE。
仅当您直接从专用/受保护的存储位置加载时,
STORAGE_INTEGRATION
、CREDENTIALS
和ENCRYPTION
才适用:如果从公有桶加载,则不需要安全访问。
如果从指定的外部暂存区加载,则该暂存区将提供访问桶所需的所有凭据信息。
如果在运行 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 INTO mytable FILE_FORMAT = (TYPE = CSV);备注
从表位置中的文件复制数据时,可以省略 FROM 子句,因为 Snowflake 会自动检查表位置中的文件。
将用户个人暂存区中的文件加载到表中:
COPY INTO mytable from @~/staged FILE_FORMAT = (FORMAT_NAME = 'mycsv');
从命名外部暂存区加载文件¶
从之前使用 CREATE STAGE 命令创建的命名外部暂存区加载文件。命名外部暂存区可引用外部位置(Amazon S3、Google Cloud Storage 或 Microsoft Azure),并包含访问该位置所需的所有凭据和其他详细信息:
COPY INTO mycsvtable FROM @my_ext_stage/tutorials/dataloading/contacts1.csv;
使用列匹配加载文件¶
使用 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';
直接从外部位置加载文件¶
以下示例使用命名 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);使用提供的凭据来访问引用的 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);
Google Cloud Storage
使用名为
myint
的引用存储集成来访问引用的 GCS 桶:COPY INTO mytable FROM 'gcs://mybucket/data/files' STORAGE_INTEGRATION = myint FILE_FORMAT = (FORMAT_NAME = my_csv_format);
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 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);
使用模式匹配加载¶
将文件从表的暂存区加载到表中,使用模式匹配只加载任何路径下压缩 CSV 文件中的数据:
COPY INTO mytable FILE_FORMAT = (TYPE = 'CSV') PATTERN='.*/.*/.*[.]csv[.]gz';
其中 .*
被解释为“出现 0 个或多个任意字符”。方括号转义为文件扩展名前的句点字符 (.
)。
使用模式匹配将文件从表暂存区加载到表中,以仅加载名称包含字符串 sales
的未压缩 CSV 文件:
COPY INTO mytable FILE_FORMAT = (FORMAT_NAME = myformat) PATTERN='.*sales.*[.]csv';
将 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" }]/* 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" | | } | +---------------------------+
重新加载文件¶
将 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 不会从该位置清除已加载的文件。要在加载后清除文件,请执行以下操作:
为表设置
PURGE=TRUE
,以指定在加载后清除所有成功加载到表中的文件:ALTER TABLE mytable SET STAGE_COPY_OPTIONS = (PURGE = TRUE); COPY INTO mytable;
您也可以直接在 COPY 命令中替换任何复制选项:
COPY INTO mytable PURGE = TRUE;
验证暂存文件¶
在不加载的情况下,验证暂存区中的文件:
在验证模式下运行 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 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]