数据加载概述¶
本主题概述了可用于将数据加载到 Snowflake 的主要选项。
本主题内容:
支持的文件位置¶
Snowflake 将数据文件在云存储中的位置称为 暂存区。COPY INTO <table> 命令用于批量和连续数据加载(即 Snowpipe),它支持由您的业务实体管理的云存储账户(即 外部暂存区)以及 Snowflake 账户中包含的云存储(即 内部暂存区)。
外部暂存区¶
无论托管 Snowflake 账户的 云平台 如何,均支持从以下任何云存储服务加载数据:
Amazon S3
Google Cloud Storage
Microsoft Azure
您不能访问存档云存储类别中保存的数据,这些数据需要恢复后才能检索。例如,这些存档存储类别包括 Amazon S3 Glacier Flexible Retrieval 或 Glacier Deep Archive 存储类别,或者 Microsoft Azure Archive Storage。
使用云存储服务提供的工具将文件上传(即 暂存)到您的云存储账户。
指定的外部暂存区是在架构中创建的数据库对象。此对象存储云存储中文件的 URL、用于访问云存储账户的设置以及便捷性设置,如描述暂存文件格式的选项。使用 CREATE STAGE 命令创建暂存区。
备注
在加载数据时,如果数据来源是不同于 Snowflake 账户的区域或云平台的云存储服务中的文件,您可能要支付某些数据传输费用。有关更多信息,请参阅 了解数据传输成本。
内部暂存区¶
Snowflake 在您的账户中维护以下暂存区类型:
- 用户:
为每个用户分配一个用户暂存区,供其存储文件。此暂存区类型旨在存储由单个用户暂存和管理,但可能加载到多个表中的数据。无法更改或删除用户暂存区。
- 表:
在 Snowflake 中创建的每个表都有一个表暂存区。此暂存区类型旨在存储由一个或多个用户暂存和管理,但仅加载到单个表中的文件。表暂存区不能更改或删除。
请注意,表暂存区不是一个单独的数据库对象;相反,它是与表本身绑定的隐式暂存区。表暂存区本身没有可授予的权限。要将文件暂存到表暂存区、列出文件、在暂存区中查询文件或删除文件,您必须是表所有者(拥有对表具有 OWNERSHIP 权限的角色)。
- 命名:
指定的内部暂存区是在架构中创建的数据库对象。此暂存区类型可存储由一个或多个用户暂存和管理,且加载到一个或多个表中的文件。指定暂存区是数据库对象,因此可以使用安全访问控制权限来控制创建、修改、使用或删除它们的能力。使用 CREATE STAGE 命令创建暂存区。
使用 PUT 命令可将文件从本地文件系统上传到任何类型的内部暂存区。
批量加载与连续加载的对比¶
Snowflake 提供了以下主要数据加载解决方案。最合适的解决方案可能取决于要加载的数据量和加载频率。
使用 COPY 命令批量加载¶
此选项允许从云存储中已有的文件批量加载数据,或将数据文件从本地计算机复制(即 暂存)到内部(即 Snowflake)云存储位置,然后再使用 COPY 类型将数据加载到表中。
计算资源¶
批量加载依赖于用户提供的虚拟仓库,这些虚拟仓库在 COPY 语句中指定。用户需要适当调整仓库的大小,以适应预期负载。
加载期间的简单转换¶
Snowflake 支持将数据加载到表中时使用 COPY 命令转换数据。选项包括:
重新排序列
忽略列
强制类型转换
截断超过目标列长度的文本字符串
您的数据文件不需要与目标表具有相同的列数和顺序。
使用 Snowpipe 连续加载¶
此选项旨在加载少量数据(即微批处理),并以增量形式使其可用于分析。在将文件添加到暂存区并提交以供引入后,Snowpipe 会在几分钟内加载数据。这可确保用户在原始数据可用后立即获得最新的结果。
计算资源¶
Snowpipe 使用 Snowflake 提供的计算资源(即无服务器计算模型)。这些 Snowflake 提供的资源会按需自动调整规模,并纵向扩展或缩减,并使用按秒计费的方式进行计费和列举明细。数据引入根据实际工作负载进行收费。
加载期间的简单转换¶
管道定义中的 COPY 语句支持与批量加载数据时相同的 COPY 转换选项。
此外,数据管道可以利用 Snowpipe,将微批量数据持续加载到暂存表中,以便使用自动任务和流中的变更数据获取 (CDC) 信息进行转换和优化。
用于复杂转换的数据管道¶
数据管道 支持为加载的数据应用复杂的转换。此工作流通常利用 Snowpipe,将“原始”数据加载到暂存表中,然后使用一系列的表流和任务来转换和优化新数据,以便进行分析。
使用 Snowpipe Streaming 进行连续加载¶
Snowpipe Streaming API 将数据行直接写入 Snowflake 表,而无需暂存文件。这种架构可降低加载延迟,并相应降低加载任何数据量的费用,因此是处理近乎实时数据流的强大工具。
Snowpipe Streaming 还可用于 Snowflake Connector for Kafka,它提供了简单的升级路径,以利用更低的延迟和更低的成本负载。
有关更多信息,请参阅 Snowpipe Streaming。
从 Apache Kafka 主题加载数据¶
Snowflake Connector for Kafka 让用户能够连接到 Apache Kafka (https://kafka.apache.org/) 服务器,从一个或多个主题中读取数据,并将该数据加载到 Snowflake 表中。
从暂存的半结构化数据文件中对列定义进行架构检测¶
半结构化数据可能包含数千列。Snowflake 为处理此类数据提供了强大的解决方案。选项包括使用外部表直接在云存储中引用数据、将数据加载到 VARIANT 类型的单个列中,或对数据进行转换并将其加载到标准关系表中的单独列中。所有这些选项都需要对数据中的列定义有一定了解。
另一种解决方案涉及到在一组暂存的半结构化数据文件中自动检测架构,并检索列定义。列定义包括文件中的列名称、列数据类型和列顺序。按照适合创建 Snowflake 标准表、外部表或视图的格式生成语法。
备注
此功能支持 Apache Parquet、Apache Avro、ORC、JSON 和 CSV 文件。
此支持通过以下 SQL 函数实现:
- INFER_SCHEMA
检测一组暂存的数据文件中的列定义,并以适合创建 Snowflake 对象的格式检索元数据。
- GENERATE_COLUMN_DESCRIPTION
使用 INFER_SCHEMA 函数输出,基于一组暂存文件生成列列表。
这些 SQL 函数支持内部和外部暂存区。
使用如下语法,通过基于一组暂存文件得出的列定义创建表或外部表: CREATE TABLE ...USING TEMPLATE 或 CREATE EXTERNAL TABLE ...USING TEMPLATE。USING TEMPLATE 子句接受一个表达式,该表达式调用 INFER_SCHEMA SQL 函数,检测文件中的列定义。创建表后,您可以使用带 MATCH_BY_COLUMN_NAME
选项的 COPY 语句,将文件直接加载到结构化表中。
架构检测也可以与 表模式演化 结合使用,其中,表的结构会自动演化,以支持从数据源接收的新数据的结构。
加载数据的替代方案¶
您可以使用以下选项查询云存储中的数据,而不需要将其加载到 Snowflake 表中。
External Tables(数据湖)¶
External Tables 支持查询存储在外部云存储中的现有数据,以便进行分析,而不需要先将其加载到 Snowflake 中。数据的事实来源仍保留在外部云存储中。通过物化视图在 Snowflake 中物化的数据集为只读。
这种解决方案特别适合在外部云存储中存储了大量数据,且只想查询部分数据(例如最新数据)的账户。用户可基于此数据的子集创建物化视图,以提高查询性能。
使用兼容 Amazon S3 的存储¶
您可以在软件和设备上、本地或私有云中创建与 Amazon S3 API 高度兼容的外部暂存区和外部表。此功能让数据的管理、治理和分析变得更轻松高效,而无论数据的物理存储位置如何。有关详细信息,请参阅 使用兼容 Amazon S3 的存储。