在开始Snowflake的学习之旅之前,强烈建议阅读文章,了解如何开始使用Snowflake。在Snowflake术语中,“阶段”(Stage)具有特定的含义,与传统ETL术语中的“暂存区”有所不同。Snowflake中的阶段用于存储数据,如果需要加载到Snowflake的数据存储在其他云区域如AWS S3、Azure或GCP中,则称为外部阶段;如果数据存储在Snowflake内部,则称为内部阶段。
首先,将详细说明内部阶段。内部阶段进一步细分为用户阶段、表阶段和内部命名阶段。在将数据加载到Snowflake表之前,需要使用PUT命令将数据加载到阶段,然后使用COPY INTO命令将其加载到表中。同样,如果需要从表中卸载数据,需要使用GET命令将其加载到阶段,然后使用COPY INTO命令进行导出。请注意,根据本地系统是Unix还是Windows,语法会有轻微变化。本文中使用的是基于Windows的系统来存储本地文件。
用户阶段与特定用户相关联。每个用户都有一个默认阶段被创建,无法修改或删除这些阶段。可以将文件复制到这些阶段,以便进一步加载到表中。加载完成后,需要显式删除这些文件,否则需要支付存储费用。一个用户阶段中的文件无法被另一个用户访问。因此,如果需要从特定用户加载多个表,则这是最佳选择。需要使用‘@~’来引用用户阶段。
表阶段与特定用户相关联。当创建一个表时,会自动创建表阶段。与用户阶段类似,无法修改或删除表阶段,但在文件加载后需要清理空间。特定表的表阶段无法通过另一个表访问。因此,如果需要加载一个表,则可以选择表阶段。需要使用‘@%’来引用表阶段。
与用户或表阶段相比,这些阶段提供了更多的灵活性。这些是Snowflake对象,因此可以在内部命名阶段上执行所有可以对对象执行的操作。需要手动创建这些阶段,并且在创建阶段时还可以指定文件格式选项,这与表阶段或用户阶段不同。需要使用‘~’来引用内部命名阶段。
将本地系统源文件加载到Snowflake的多个表中,然后处理数据。处理后的数据将在目标表中可用。从目标表卸载数据到本地系统文件。注意:由于数据处理超出了本文的范围,将跳过这部分。将手动填充目标表中的数据。假设是特定员工工资的聚合。
由于需要在这里加载多个表,可以选择用户阶段或命名阶段。由于数据处理超出了本文的范围,因此没有包括那部分。假设处理后的数据在目标表中可用。由于它是一个单一的目标表,可以使用表阶段或命名阶段从表中卸载数据。
# 登录到SNOWSQL
snowsql -a <>.ap-south-1.aws -u <>
# 1.使用PUT命令将所有文件从本地磁盘加载到用户阶段
use role accountadmin;
use warehouse compute_wh;
use database DEMO_DB;
use schema PUBLIC;
put file://D:SnowflakeContentF_EMP_SAL1.txt @~;
put file://D:SnowflakeContentF_EMP_SAL2.txt @~;
select * from T_EMP_SAL1;# 这将返回空表
select * from T_EMP_SAL2;# 这将返回空表
# 2.使用COPY INTO表命令将文件从用户阶段加载到Snowflake的源表
copy into T_EMP_SAL1 from @~/F_EMP_SAL1.txt;
copy into T_EMP_SAL2 from @~/F_EMP_SAL2.txt;
select * from T_EMP_SAL1;
select * from T_EMP_SAL2;
# 3.将文件从目标表复制到表阶段
copy into @%T_EMP_TARGET from T_EMP_TARGET;
select * from T_EMP_TARGET;
# 4.使用GET卸载到本地系统
get @%T_EMP_TARGET file://D:SnowflakeContent
# 5.清理所有阶段中的文件以避免存储费用
list @~;
rm @~ pattern='.*txt.*';
rm @%T_EMP_TARGET;
图片来源:
为了便于理解,将使用以下命名约定:
客户端机器上应安装SNOWSQL。如果没有Snowflake免费试用账户,请查看本文关于如何在Snowflake上创建免费试用账户。本地txt文件内容如下:
F_EMP_SAL1.txt
1,aaron,3000
2,vidhya,4000
F_EMP_SAL2.txt
1,Ben,7000
2,vidhya,2000
在Snowflake中创建源表和目标表的脚本如下:
use role accountadmin;
use warehouse compute_wh;
use database DEMO_DB;
use schema PUBLIC;
create table T_EMP_SAL1(emp_id integer,emp_name varchar,empsal float);
create table T_EMP_SAL2(emp_id integer,emp_name varchar,empsal float);
create table T_EMP_TARGET(emp_id integer,emp_name varchar,empsal float);
insert into T_EMP_TARGET
values
(1,'Aaron',8000),
(1,'Vidhya',4000),
(1,'Ben',7000);
将看到本节中使用的代码。
如果文件位于外部云位置,例如,如果需要从AWS S3加载文件到Snowflake,则可以使用外部阶段。与内部阶段不同,加载和卸载数据可以直接使用COPY INTO完成。Get和Put命令在外部阶段不受支持。外部阶段也可以通过Web用户界面或SNOWSQL创建。将看到如何使用Web用户界面创建。
从AWS S3加载文件到Snowflake表中使用外部阶段。
要执行此演示,需要拥有AWS账户。需要访问密钥和秘密密钥以连接到AWS账户。在Snowflake中创建一个表,其中需要加载数据,如下所示:
在本文中,了解了什么是阶段以及如何在Snowflake中使用阶段。是否注意到在第一个使用案例中没有使用任何类似创建阶段的命令?这是因为使用了表阶段和用户阶段,也可以使用内部阶段代替,因为内部阶段比表阶段和用户阶段提供了更多的灵活性。