第六章:数据的加载和卸载
数据工程师负责管理从各种不同的来源中提取和转换原始数据集,以提供最终用户所需的数据状态,从而获得可行的见解。本章提供了基础知识,任何人都可以使用这些知识来了解如何在Snowflake云数据平台上实现最佳的数据工程结果。
本章首先总结了Snowflake数据加载和卸载的基本概念,包括数据类型、压缩方法、文件格式类型和Snowflake stage。在数据加载工具部分,我们将深入学习如何在Snowflake工作表中使用SQL插入语句来加载结构化和半结构化数据。我们还将学习如何使用Web UI Load Data向导和SnowSQL命令行界面(CLI)加载数据。对于更自动化的数据加载方法,我们可以使用数据管道、连接器和第三方工具。本章后面将探讨一些自动化数据加载选项。此外,我们还将介绍一些数据加载的替代方法,例如在外部stage上创建物化视图和访问共享数据。最后,我们将讨论如何从Snowflake卸载数据文件。
在我们的实际示例中,我们将主要在默认的Web UI Snowsight中完成大部分工作。然而,我们需要暂时切换到Snowflake经典控制台来使用Load Data向导,并在需要下载SnowSQL时使用它。在深入学习之前,让我们首先完成本章实际示例所需的准备工作。
准备工作
创建一个名为Chapter6 Data Loading and Unloading的新工作表。如果需要创建新的工作表,请参考“导航Snowsight工作表”。要设置工作表上下文,请确保使用SYSADMIN角色和COMPUTE_WH虚拟仓库。
在本章中,我们所有的工作都将在一个数据库中完成。对于每种上传类型,我们将创建一个单独的模式。此外,我们将在所有CREATE语句中包含注释。请在Snowsight Web UI工作表中执行以下SQL语句:
USE ROLE SYSADMIN;
USE WAREHOUSE COMPUTE_WH;
CREATE OR REPLACE DATABASE DEMO6_DB
COMMENT = "Database for all Chapter 6 Examples";
CREATE OR REPLACE SCHEMA WS COMMENT = "Schema for Worksheet Insert Examples";
CREATE OR REPLACE SCHEMA UI COMMENT = "Schema for Web UI Uploads";
CREATE OR REPLACE SCHEMA SNOW COMMENT = "Schema for SnowSQL Loads";
CREATE OR REPLACE WAREHOUSE LOAD_WH
COMMENT = "Warehouse for CH 6 Load Examples";
您还需要一个CSV文件,以便使用Web UI Load Data向导和SnowSQL CLI进行上传。在GitHub上有本章的文件,包括CSV文件,您可以下载并使用。或者,您可以使用表6-1中的数据创建自己的文件。您可以将该表保存为名为TABLE20的CSV逗号分隔文件。
数据加载和卸载的基础知识
在进行数据加载和卸载的实际示例之前,我们需要先了解一些重要的概念。在本节中,我们将花一些时间学习半结构化数据的数据类型。我们还将了解Snowflake支持的文件格式类型和数据文件压缩方法。此外,我们还将讨论数据加载选项的频率差异,并介绍Snowflake的阶段(Stages)以及在SQL语句中引用不同类型的阶段的方法。最后,我们还将注意一些适用于数据加载的不同数据源。
数据类型
Snowflake的数据类型在第4章中介绍过,我们深入探讨了支持结构化数据的Snowflake数据类型。在本章中,我们将使用几种用于结构化数据的数据类型,并深入探讨半结构化数据类型VARIANT、OBJECT和ARRAY。
半结构化数据类型
Snowflake提供了灵活的架构数据类型来加载半结构化数据。在加载半结构化数据之前不需要进行任何转换,因为Snowflake会自动将半结构化数据转换为完全关系型的方式,以便进行SQL查询。
Snowflake使用三种数据类型来支持半结构化数据类型:VARIANT、OBJECT和ARRAY。有趣的是,VARIANT数据类型可以存储任何其他Snowflake数据类型的值,包括OBJECT和ARRAY。因此,VARIANT被视为通用数据类型。
如果您还不确定要对加载到Snowflake中的半结构化数据执行哪些操作,Snowflake的VARIANT数据类型是一个不错的选择。
Snowflake的OBJECT数据类型表示键值对的集合,其中键是非空字符串,值是VARIANT数据类型。Snowflake的ARRAY数据类型表示任意大小的密集或稀疏数组,索引为非负整数,值为VARIANT数据类型。
文件格式
文件格式是可以与COPY命令一起使用的Snowflake对象。文件格式定义了数据文件的参数,如压缩和文件类型。它还定义了格式选项,如CSV文件的去除空格和字段分隔符,以及JSON文件的去除外部数组。本节稍后将列出CSV和JSON文件的不同文件格式参数。
Snowflake支持的用于数据导出的文件格式类型包括半结构化数据的JSON和Parquet,以及结构化数据的CSV和TSV等分隔文件格式。Snowflake支持的数据加载文件格式类型包括导出文件格式类型相同的格式类型,以及XML、Avro和ORC。
当从CSV或TSV等分隔文件加载数据到Snowflake时,默认的字符集是UTF-8;其他字符集也可以用于分隔文件,但它们会在存储到表中之前被Snowflake转换为UTF-8。对于所有其他支持的文件格式,加载数据时仅支持UTF-8字符集。对于数据导出,无论文件格式类型如何,只支持UTF-8字符集。
在将数据加载到Snowflake中或从Snowflake中导出数据时,有许多格式选项可供选择。可用的格式选项取决于文件格式的类型。表6-2列出了CSV文件格式类型的格式选项。
表6-3包含了JSON文件格式类型的格式选项。JSON文件格式类型是Snowflake支持的多种半结构化数据类型之一。其他半结构化数据类型(如Avro、ORC、Parquet和XML)的格式类型选项可以在Snowflake在线文档中找到。
在Snowflake数据加载中创建文件格式是可选的。如果您预计会在加载类似结构的文件时重复使用它们,建议创建文件格式对象。
数据文件压缩
您可以将压缩和非压缩的数据加载到Snowflake中。默认情况下,Snowflake会使用gzip对所有存储的数据进行压缩,无需选择列或选择压缩算法。如果您的数据文件较大,建议在将数据加载到Snowflake之前对其进行压缩。Snowflake支持GZIP、BZIP2、DEFLATE、RAW_DEFLATE、BROTLI和ZSTANDARD(ZSTD)压缩方法,并且可以自动检测除BROTLI和ZSTANDARD(ZSTD)之外的所有压缩方法。对于这些压缩方法,您需要在数据加载时指定压缩方法。
数据处理的频率
数据处理始于准备、处理和存储原始数据。可以将实时数据流传输到存储中以实现即时可用性,但更常见的是以接近实时的方式处理数据。有时数据会以批处理的方式进行处理。让我们来看看这些数据处理类型之间的区别。
批处理
批处理涉及自动处理在指定时间段内积累的大量数据。工资系统是批处理的一个很好的例子,因为数据可能只需要每两周处理一次。任何只能按批次访问的数据、数据新鲜度对任务关键性不是很重要的情况,以及在大数据集上使用复杂算法时都可以考虑使用批处理。批处理的最重要优势是它通常比其他类型的数据处理成本更低。它的成本较低是因为计算资源仅在执行处理时使用,而且由于批处理执行的频率较低于近实时处理,因此总体成本更低。不过,这种权衡是数据的新鲜度。
流式处理、连续加载和微批处理
流式处理、流处理、连续加载、近实时处理和微批处理这些术语经常互换使用,因为在实践中它们实现了类似的结果。连续加载、近实时处理和微批处理是同义词;然而,这三个术语与流式处理和流处理之间存在差异。
对于微批处理实现,批处理在小量数据上执行,这些数据可以在不到60秒内处理完毕。如果数据通常需要超过60秒才能加载完毕,您可能需要考虑减少每个批次的大小。每个微批次之间的时间间隔可能大于60秒,但通常在加载之间不超过几分钟。这实现了近实时的结果。
相比之下,纯流式处理解决方案会使用工具,例如Kafka Streams API或Confluent的KSQL,在实际实时数据至关重要的情况下。实时数据重要的示例包括安全情况,其中数据应用提供即时的欺诈检测功能,以及运营情况,其中重要的是实时查看电子商务数据或物联网(IoT)数据,例如安全摄像头或患者医疗设备。
在下一节中,我们将讨论使用所有方法加载数据的方式,但主要集中在连续加载的实现上。与批处理不同,连续加载要么没有状态,要么具有小的状态,并且通常涉及相对简单的转换。连续加载通常用于需要实时、新鲜数据的场景,而不需要知道过去两三秒钟发生了什么。一些可能使用连续加载的情况包括网站分析和人力资源系统。
Snowflake阶段引用
Snowflake阶段在第3章中进行了介绍。在这里我们将简要回顾一些关键信息,因为它们是Snowflake数据加载和卸载的重要组成部分。
Snowflake阶段是作为中间步骤使用的临时存储空间,用于将文件导入Snowflake表或将数据从Snowflake表导出到文件中。有两种主要类型的阶段:内部阶段和外部阶段。对于外部阶段,文件存储在外部位置(例如S3存储桶)中,并通过外部阶段进行引用。以前,对这些外部位置的访问是通过云身份和访问管理(IAM)角色和访问控制列表(ACL)进行管理的。然而,现在的最佳实践是创建存储集成。存储集成是一个Snowflake对象,用于存储外部云存储的生成IAM实体,并可选择包括Amazon S3、Google Cloud Storage或Microsoft Azure的允许或阻止的存储位置。
内部阶段类型包括内部命名阶段、用户阶段和表阶段。请注意,Snowflake中的所有阶段类型都使用@符号进行引用。
名字阶段
内部命名阶段是数据库对象,因此可以被授予具有适当权限的角色的任何用户使用。在引用命名阶段的SQL语句中,需要使用@符号加上阶段的名称。要列出命名阶段,可以运行LIST @语句。