COPY INTO <表>
COPY INTO 允许您从以下位置的文件加载数据:
- 用户/内部/外部阶段:了解 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>'
您可以使用通配符模式指定多个文件。例如,使用
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。有关使用 PATTERN 参数过滤文件的示例和有用提示,请参阅示例 4:使用模式过滤文件。
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 数据将被替换为空值。如果设置为 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);
示例 2:从外部位置加载
以下示例展示了从不同类型的外部源向 Databend 加载数据:
- Amazon S3
- Azure Blob Storage
- 远程文件
- IPFS
此示例使用 AWS 访问密钥和密钥连接到 Amazon S3,并从 CSV 文件加载 10 行数据:
-- 通过 AWS 访问密钥和密钥进行认证。
COPY INTO mytable
FROM 's3://mybucket/data.csv'
CONNECTION = (
ACCESS_KEY_ID = '<your-access-key-ID>',
SECRET_ACCESS_KEY = '<your-secret-access-key>'
)
FILE_FORMAT = (
TYPE = CSV,
FIELD_DELIMITER = ',',
RECORD_DELIMITER = '\n',
SKIP_HEADER = 1
)
SIZE_LIMIT = 10;
此示例使用 AWS IAM 角色认证和外部 ID 连接到 Amazon S3,并从 'mybucket' 中加载匹配指定模式的 CSV 文件:
-- 通过 AWS IAM 角色和外部 ID 进行认证。
COPY INTO mytable
FROM 's3://mybucket/'
CONNECTION = (
ENDPOINT_URL = 'https://<endpoint-URL>',
ROLE_ARN = 'arn:aws:iam::123456789012:role/my_iam_role',
EXTERNAL_ID = '123456'
)
PATTERN = '.*[.]csv'
FILE_FORMAT = (
TYPE = CSV,
FIELD_DELIMITER = ',',
RECORD_DELIMITER = '\n',
SKIP_HEADER = 1
);
此示例连接到 Azure Blob Storage 并从 'data.csv' 加载数据到 Databend:
COPY INTO mytable
FROM 'azblob://mybucket/data.csv'
CONNECTION = (
ENDPOINT_URL = 'https://<account_name>.blob.core.windows.net',
ACCOUNT_NAME = '<account_name>',
ACCOUNT_KEY = '<account_key>'
)
FILE_FORMAT = (type = CSV);
此示例从三个远程 CSV 文件加载数据,并在出现错误时跳过文件。
COPY INTO mytable
FROM 'https://ci.databend.org/dataset/stateful/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
);