卸载到 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:DeleteObject
s3: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:
创建命名暂存区¶
以下示例使用名为 unload
的 S3 桶来创建一个名为 my_ext_unload_stage
的外部暂存区,文件夹路径名为 files
。该暂存区使用名为 s3_int
的现有存储集成访问 S3 桶。
该暂存区引用名为 my_csv_unload_format
的指定文件格式对象,该对象在 准备卸载数据 步骤中创建:
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
表中的所有行卸载到mybucket
S3 桶中一个或多个文件夹路径前缀为unload/
的文件:COPY INTO s3://mybucket/unload/ from mytable storage_integration = s3_int;
备注
在此示例中,使用名为
s3_int
的引用存储集成来访问引用的 S3 桶 。使用 S3 控制台(或同等客户端应用程序)从桶中检索对象(即命令生成的文件)。