卸载到 Amazon S3¶
如果您已经拥有 Amazon Web Services (AWS) 账户并使用 S3 桶来存储和管理数据文件,您可以在从 Snowflake 表卸载数据时使用现有桶和文件夹路径。本主题介绍如何使用 COPY 命令来将数据从表卸载到 Amazon S3 桶。然后,您可以将卸载的数据文件下载到本地文件系统。
如下图所示,要将数据卸载到 S3 桶,分两步执行:
- 第 1 步:
使用 COPY INTO <location> 命令将 Snowflake 数据库表中的数据复制到 S3 桶中的一个或多个文件。在命令中,您可指定引用 S3 桶的已命名外部暂存区对象(建议),或者您可通过指定 URI 和桶存储集成或安全凭据(如需要) 其中一个 来选择直接卸载到桶。
无论您使用哪种方法,如果您手动或在脚本中执行命令,此步骤都需要运行一个当前虚拟仓库的会话。仓库提供计算资源来从表中写入行。
- 第 2 步:
使用 Amazon 提供的接口/工具从 S3 桶下载文件。
本主题内容:
允许 Amazon Virtual Private Cloud IDs¶
如果您组织中的 AWS 管理员尚未明确授予 Snowflake 访问 AWS S3 存储账户的权限,您现在就可以这样做。请遵循数据加载配置说明 允许虚拟私有云 IDs 中的步骤操作。
配置 S3 桶,以卸载数据¶
Snowflake 需要对 S3 桶和文件夹具有以下权限才能在该文件夹(以及任何子文件夹)中创建新文件:
s3:DeleteObjects3:PutObject
作为最佳实践,Snowflake 建议配置存储集成对象,将外部云存储的身份验证责任委托给 Snowflake Identity and Access Management (IAM) 实体。
有关配置说明,请参阅 配置对 Amazon S3 的安全访问。
配置对 Amazon S3 访问控制列表的支持 – 可选¶
Snowflake 存储集成支持 AWS 访问控制列表 (ACLs),以授予桶所有者完全控制权。通过卸载的表数据在 Amazon S3 桶中创建的文件由 AWS Identity and Access Management (IAM) 角色所拥有。ACLs 支持以下用例:配置一个 AWS 账户中的 IAM 角色,以访问一个或多个其他 AWS 账户中的 S3 桶。若没有 ACL 支持,桶所有者账户中的用户无法访问使用存储集成卸载到外部 (S3) 暂存区的数据文件。当用户使用 COPY INTO <location> 将 Snowflake 表数据卸载到外部 (S3) 暂存区中的数据文件时,卸载操作会将 ACL 应用到卸载的数据文件。数据文件将 "s3:x-amz-acl":"bucket-owner-full-control" 权限应用于文件,授予 S3 桶所有者对它们的完全控制权。
通过可选的 STORAGE_AWS_OBJECT_ACL = 'bucket-owner-full-control' 参数,在 S3 暂存区的存储集成中启用 ACL 支持。存储集成是一个 Snowflake 对象,用于存储为 S3 云存储生成的 Identity and Access Management (IAM) 用户,以及一组可选的已允许或已阻止的存储位置(即 S3 桶)。组织中的 AWS 管理员将生成的 IAM 用户添加至角色,以授予 Snowflake 访问指定 S3 桶的权限。此功能允许用户在创建暂存区或加载数据时避免提供凭据。管理员可以在创建存储集成(使用 CREATE STORAGE INTEGRATION)时设置 STORAGE_AWS_OBJECT_ACL 参数,也可以稍后(使用 ALTER STORAGE INTEGRATION)进行设置。
将数据卸载到外部暂存区¶
外部暂存区是指定的数据库对象,为数据卸载提供最大程度的灵活性。因为它们是数据库对象,所以可以将指定暂存区的权限授予任何角色。
您可以使用 Web 界面或 SQL 来创建指定的外部暂存区:
- Classic Console:
- SQL:
创建命名暂存区¶
Snowflake uses multipart uploads when uploading to Amazon S3 and Google Cloud Storage. This process might leave incomplete uploads in the storage location for your external stage.
To prevent incomplete uploads from accumulating, we recommend that you set a lifecycle rule. For instructions, see the Amazon S3 (https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html) or Google Cloud Storage (https://cloud.google.com/storage/docs/lifecycle#abort-mpu) documentation.
以下示例使用名为 unload 的 S3 桶来创建一个名为 my_ext_unload_stage 的外部暂存区,文件夹路径名为 files。该暂存区使用名为 s3_int 的现有存储集成访问 S3 桶。
The stage references a named file format object called my_csv_unload_format. For instructions, see 准备卸载数据.
CREATE OR REPLACE STAGE my_ext_unload_stage URL='s3://unload/files/'
STORAGE_INTEGRATION = s3_int
FILE_FORMAT = my_csv_unload_format;
将数据卸载到命名暂存区¶
通过外部暂存区,使用 COPY INTO <location> 命令将表中数据卸载到 S3 桶。
以下示例使用
my_ext_unload_stage暂存区将mytable表中的所有行卸载到 S3 桶中的一个或多个文件。将d1文件名前缀应用于文件:COPY INTO @my_ext_unload_stage/d1 from mytable;
使用 S3 控制台(或同等客户端应用程序)从桶中检索对象(即命令生成的文件)。
将数据直接卸载到 S3 桶中¶
使用 COPY INTO <location> 命令将表中数据直接卸载到指定的 S3 桶中。当您不计划使用相同的表和桶参数定期卸载数据时,此选项非常适合临时卸载。
您必须在 COPY 命令中指定 S3 桶的 URI,以及访问桶所需的存储集成或凭据。
以下示例将
mytable表中的所有行卸载到mybucketS3 桶中一个或多个文件夹路径前缀为unload/的文件:COPY INTO 's3://mybucket/unload/' FROM mytable STORAGE_INTEGRATION = s3_int;
备注
在此示例中,使用名为
s3_int的引用存储集成来访问引用的 S3 桶 。使用 S3 控制台(或同等客户端应用程序)从桶中检索对象(即命令生成的文件)。