COPY INTO <表>
COPY INTO 允许您从以下位置之一的文件中加载数据:
- 用户/内部/外部阶段: 请参阅 什么是Stage? 以了解 Databend 中的阶段。
- 存储服务中创建的存储桶或容器。
- 远程服务器,您可以通过其 URL(以 "https://..." 开头)访问文件。
- IPFS。
另请参阅: COPY INTO <位置>
语法
COPY INTO [<数据库名>.]<表名>
FROM { userStage | internalStage | externalStage | externalLocation |
( SELECT [<文件列> ... ]
FROM { userStage | internalStage | externalStage } ) }
[ FILES = ( '<文件名>' [ , '<文件名>' ] [ , ... ] ) ]
[ PATTERN = '<正则表达式模式>' ]
[ FILE_FORMAT = (
FORMAT_NAME = '<您的自定义格式>'
| TYPE = { CSV | TSV | NDJSON | PARQUET | ORC } [ formatTypeOptions ]
) ]
[ copyOptions ]
FROM ...
FROM 子句指定数据将通过 COPY INTO 命令加载到指定表中的源位置(用户阶段、内部阶段、外部阶段或外部位置)。您还可以嵌套一个 SELECT ... FROM 子查询来转换您要加载的数据。有关更多信息,请参阅 加载时转换数据。
当您从阶段文件加载数据且阶段路径包含空格或括号等特殊字符时,您可以将整个路径用单引号括起来,如下面的 SQL 语句所示:
COPY INTO mytable FROM 's3://mybucket/dataset(databend)/' ... COPY INTO mytable FROM 's3://mybucket/dataset databend/' ...
userStage
userStage ::= @~[/<路径>]
internalStage
internalStage ::= @<内部阶段名>[/<路径>]
externalStage
externalStage ::= @<外部阶段名>[/<路径>]
externalLocation
- Amazon S3-like Storage
- Azure Blob Storage
- Google Cloud Storage
- Alibaba Cloud OSS
- Tencent Cloud Object Storage
- HDFS
- WebHDFS
- Remote Files
- IPFS
externalLocation ::=
's3://<存储桶>[<路径>]'
CONNECTION = (
<连接参数>
)
有关访问 Amazon S3-like 存储服务的可用连接参数,请参阅 连接参数。
externalLocation ::=
'azblob://<容器>[<路径>]'
CONNECTION = (
<连接参数>
)
有关访问 Azure Blob Storage 的可用连接参数,请参阅 连接参数。
externalLocation ::=
'gcs://<存储桶>[<路径>]'
CONNECTION = (
<连接参数>
)
有关访问 Google Cloud Storage 的可用连接参数,请参阅 连接参数。
externalLocation ::=
'oss://<存储桶>[<路径>]'
CONNECTION = (
<连接参数>
)
有关访问 Alibaba Cloud OSS 的可用连接参数,请参阅 连接参数。
externalLocation ::=
'cos://<存储桶>[<路径>]'
CONNECTION = (
<连接参数>
)
有关访问 Tencent Cloud Object Storage 的可用连接参数,请参阅 连接参数。
externalLocation ::=
'hdfs://<端点URL>[<路径>]'
CONNECTION = (
<连接参数>
)
有关访问 HDFS 的可用连接参数,请参阅 连接参数。
externalLocation ::=
'webhdfs://<端点URL>[<路径>]'
CONNECTION = (
<连接参数>
)
有关访问 WebHDFS 的可用连接参数,请参阅 连接参数。
externalLocation ::=
'https://<URL>'
您可以使用 glob 模式指定多个文件。例如,使用
ontime_200{6,7,8}.csv
表示ontime_2006.csv
,ontime_2007.csv
,ontime_2008.csv
。ontime_200[6-8].csv
表示ontime_2006.csv
,ontime_2007.csv
,ontime_2008.csv
。
externalLocation ::=
'ipfs://<您的IPFS哈希>'
CONNECTION = (ENDPOINT_URL = 'https://<您的IPFS网关>')
FILES
FILES 指定要加载的一个或多个文件名(用逗号分隔)。
PATTERN
一个基于 PCRE2 的正则表达式模式字符串,用单引号括起来,指定要匹配的文件名。有关 PCRE2 语法,请参阅 http://www.pcre.org/current/doc/html/pcre2syntax.html。请参阅 示例 4: 使用模式过滤文件 以获取示例和有关使用 PATTERN 参数过滤文件的有用提示。
FILE_FORMAT
详情请参阅 输入 & 输出文件格式。
copyOptions
copyOptions ::=
[ SIZE_LIMIT = <数字> ]
[ PURGE = <布尔值> ]
[ FORCE = <布尔值> ]
[ DISABLE_VARIANT_CHECK = <布尔值> ]
[ ON_ERROR = { continue | abort | abort_N } ]
[ MAX_FILES = <数字> ]
参数 | 描述 | 是否必需 |
---|---|---|
SIZE_LIMIT | 指定给定 COPY 语句要加载的最大数据行数。默认为 0 ,表示没有限制。 | 可选 |
PURGE | 如果为 True ,命令将在文件成功加载到表中后清除 阶段中的文件。默认值:False 。 | 可选 |
FORCE | COPY INTO 通过自动跟踪并防止在默认 12 小时期间内重复加载文件来确保幂等性。可以使用 load_file_metadata_expire_hours 设置自定义文件元数据过期时间。此参数默认为 False ,表示 COPY INTO 在复制数据时会跳过重复文件。如果为 True ,则不会跳过重复文件。 | 可选 |
DISABLE_VARIANT_CHECK | 如果为 true ,在 COPY INTO 期间,无效的 JSON 数据将被替换为 null 值。如果为 false (默认),COPY INTO 在遇到无效 JSON 数据时会失败。 | 可选 |
ON_ERROR | 决定如何处理包含错误的文件:'continue' 跳过并继续,'abort' 在错误时终止,'abort_N' 在错误 ≥ N 时终止。默认值为 'abort'。注意:'abort_N' 不适用于 Parquet 文件。 | 可选 |
MAX_FILES | 设置尚未加载的最大文件数。该值可以设置为最多 15000;任何大于 15000 的值都将被视为 15000。 | 可选 |
RETURN_FAILED_ONLY | 当设置为 'True' 时,输出中仅返回加载失败的文件。默认值:False 。 | 可选 |
在导入大量数据(如日志)时,建议将 PURGE
和 FORCE
都设置为 True。这确保了高效的数据导入,无需与 Meta 服务器交互(更新已复制文件集)。但需要注意的是,这可能会导致重复数据导入。
输出
COPY INTO 提供了数据加载结果的摘要,包含以下列:
列名 | 类型 | 可空性 | 描述 |
---|---|---|---|
FILE | VARCHAR | 否 | 源文件的相对路径。 |
ROWS_LOADED | INT | 否 | 从源文件加载的行数。 |
ERRORS_SEEN | INT | 否 | 源文件中的错误行数。 |
FIRST_ERROR | VARCHAR | 是 | 源文件中发现的第一个错误。 |
FIRST_ERROR_LINE | INT | 是 | 第一个错误的行号。 |
如果 RETURN_FAILED_ONLY 设置为 True,输出将仅包含加载失败的文件。
分布式 COPY INTO
Databend 中的 COPY INTO 功能在集群环境中自动激活分布式执行,增强了数据加载的效率和可扩展性。
示例
示例 1:从阶段加载
这些示例展示了从不同类型的阶段将数据加载到 Databend 中:
- 用户阶段
- 内部阶段
- 外部阶段
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);