Snowflake 数据压缩

2025年1月29日 | 阅读10分钟

引言

数据压缩是通过使用比原始表示更少的比特来编码信息。在数据库和数据仓库的背景下,压缩可以减少存储在磁盘上的数据大小,从而显著节省成本并提高性能。打包的信息需要更少的额外空间,并且可以比未压缩的数据更快地从磁盘读取和通过网络传输。

压缩类型

Snowflake 结合使用多种压缩算法,根据数据类型和特性选择最合适的算法。

主要的压缩技术包括

Snowflake Data Compression

内部数据压缩

自动压缩

Snowflake 会自动压缩存储在其内部存储中的数据。当您将数据加载到 Snowflake 中时,它会自动使用各种压缩技术进行压缩。这对用户是透明的,这意味着您在加载数据时无需指定压缩设置。

压缩技术: Snowflake 使用多种复杂的算法和技术,包括

  • 列式压缩: 由于 Snowflake 以列式格式存储数据,因此它可以利用针对不同数据类型和分布优化的列特定压缩算法。
  • 字典编码: 此技术用更短、更高效的代码替换频繁出现的值。
  • 行程长度编码 (RLE): 用于通过存储值及其计数来压缩重复值序列。
  • 增量编码: 仅存储顺序值之间的差异,适用于数字或时间序列数据。
  • Lempel-Ziv (LZ) 压缩: 一种无损数据压缩算法,可有效处理重复模式。

数据存储格式

  • 微分区: Snowflake 将数据组织成微分区,它们是小的连续存储单元。每个微分区独立压缩,从而实现高效的存储和检索。微分区策略确保 Snowflake 的内部压缩针对查询性能和存储节省进行了优化。

外部数据压缩

文件格式

Snowflake 支持各种可以压缩的外部文件格式,以节省存储空间并减少传输时间。支持的格式包括

  • Parquet
    • 压缩算法: Parquet 文件可以使用多种内置压缩编解码器,例如 Snappy、GZIP 和 Brotli。Parquet 的列式存储格式意味着压缩可以单独应用于每个列,这提高了效率。
    • Parquet 根据数据类型和分布为列使用不同的压缩算法。这种多级压缩可实现高压缩比和高效的数据访问。
  • ORC(优化行式列式)
    • 压缩算法: ORC 文件可以使用 Zlib、LZO 和 Snappy 等压缩技术。与 Parquet 一样,ORC 是一种列式格式,受益于列式压缩。
    • ORC 文件针对复杂查询进行了优化,并提供高压缩比。它们还包括内置索引和元数据,可提高查询性能。
  • CSV(逗号分隔值)
    • 压缩算法: CSV 文件可以在加载到 Snowflake 之前使用 GZIP 或 BZIP2 进行压缩。
    • 压缩的 CSV 文件在堆栈到 Snowflake 之前会减少信息记录的大小,这可以减少加载时间和存储成本。

外部阶段

AWS S3、Google Cloud Storage、Azure Blob Storage

  • 当您使用外部阶段将数据加载到 Snowflake 时,您可以使用这些云存储服务的压缩功能。例如,您可以在这些平台上存储 GZIP、BZIP2 或其他受支持格式的压缩文件。
  • 集成: Snowflake 与这些外部存储解决方案集成,使您能够使用它们的压缩选项来有效管理存储成本和性能。加载到 Snowflake 时,数据会在 COPY INTO 操作期间自动解压缩。

压缩和解压缩函数

Snowflake 提供了几个内置函数,以方便在 SQL 查询中对数据进行压缩和解压缩。这些函数在处理大量数据时非常有用,可以实现更高效的存储和检索。以下是 Snowflake 中与压缩和解压缩相关的主要函数

  • COMPRESS: 将输入数据压缩为二进制格式。
  • DECOMPRESS_BINARY: 解压缩使用 COMPRESS 函数压缩的二进制数据。
  • DECOMPRESS_STRING: 将使用 COMPRESS 函数压缩的二进制数据解压缩为字符串格式。

让我们更详细地探讨这些函数:它们的语法、用例和实际示例。

COMPRESS 函数

Snowflake 中的 COMPRESS 函数用于将数据压缩为二进制格式。此函数可以显著减小数据大小,这对于存储和性能非常有利,尤其是在处理大型数据集时。

语法

  • 输入:要压缩的数据。这可以是任何可以隐式转换为 BINARY 的数据类型。

示例

假设我们有一个要压缩的重要文本字符串

此查询压缩输入字符串并以二进制格式返回。然后可以将压缩数据存储在表中以供以后使用。

DECOMPRESS_BINARY 函数

DECOMPRESS_BINARY 函数解压缩以前使用 COMPRESS 函数压缩的二进制数据。此函数在检索和使用原始数据以其压缩二进制形式时是正确的。

语法

  • 输入: 要解压缩的压缩二进制数据。

示例

假设我们有一个压缩表,其中包含一个存储压缩二进制数据的列“compressed_data”,我们可以按如下方式解压缩它:

此查询从表中检索压缩数据并将其解压缩为原始二进制格式。

DECOMPRESS_STRING 函数

DECOMPRESS_STRING 函数用于将二进制数据解压缩为字符串格式。当原始数据为文本格式并需要以这种方式检索时,这非常有用。

语法

  • 输入: 要解压缩为字符串的压缩二进制数据。

示例

使用相同的压缩表,我们可以将二进制数据解压缩回字符串

此查询检索压缩数据并将其解压缩为原始字符串格式。

选择正确的压缩策略

虽然 Snowflake 会自动处理许多压缩优化,但您仍然可以遵循一些最佳实践来充分利用压缩和解压缩

  • 数据类型: 使用更易于压缩的适当数据类型。例如,对于数值数据,使用整数而不是字符串。
  • 批处理: 批量压缩数据,以减少多次压缩操作的开销。
  • 存储监控: 定期监控存储指标,以识别压缩的好处并根据需要调整策略。

高效数据加载

确保数据已正确分区和索引,以优化压缩过程。Snowflake 的自动微分区可以提供帮助,但提供与自然数据边界对齐的数据可以提高压缩效率。

Snowflake 中支持的文件格式

Snowflake 支持各种结构化和半结构化数据的文件格式。这些格式可以在将数据加载到 Snowflake 表中或创建外部表以查询存储在外部阶段中的数据时使用。下表总结了所支持的记录设计以及相关注意事项。

Snowflake Data Compression
文件格式类型注意事项
CSV结构化- 支持可选标题、可自定义分隔符和封闭字符。
JSON半结构化- 支持嵌套数据结构。
AVRO半结构化- 支持模式演变的二进制格式。
ORC半结构化- 针对读取密集型操作和大规模分析进行了优化。
PARQUET半结构化- 针对性能和高效数据压缩进行了优化的列式存储格式。
XML半结构化- 它支持分层数据,但解析起来可能很复杂。
TSV结构化- 类似于 CSV,但使用制表符作为分隔符。
Excel结构化- 它支持 .xls 和 .xlsx 格式,这对于与业务应用程序集成非常有用。
压缩格式
Gzip压缩- 广泛用于压缩 CSV 等文本文件。
Bzip2压缩- 提供比 gzip 更高的压缩比,但压缩/解压缩速度较慢。
DEFLATE压缩- Zip 文件和 HTTP 压缩中使用的标准算法。
Standard (ZSTD)压缩- 平衡压缩比和速度,比 gzip 和 bzip2 更新。
Snappy压缩- 优化速度而不是压缩比,适用于实时压缩需求。

Snowflake 对各种结构化和半结构化文件格式以及各种压缩选项的支持,为不同的数据存储和处理需求提供了灵活性。通过有效利用这些格式,用户可以优化存储成本,提高查询性能,并高效管理大量数据。

创建命名文件格式

在 Snowflake 中,命名文件格式定义了在将数据加载到表中时如何解析和处理数据文件。您可以通过 Snowflake Web 界面或 SQL 命令创建和管理命名文件格式。这两种方法都提供了灵活性,以适应不同的工作流程和偏好。

使用 Snowflake Web 界面

Snowflake Web 界面提供了一个图形用户界面 (GUI) 来创建和管理文件格式。这项技术非常适合喜欢可视化方法并希望避免编写 SQL 命令的客户。

步骤:

  • 登录 Snowflake
    • 通过打开浏览器并导航到 Snowflake
    • URL 访问 Snowflake Web 界面。输入您的凭据登录。
  • 导航到文件格式部分
    • 在 Snowflake Web 界面中选择要创建文件格式的数据库和架构。
    • 转到“数据库”选项卡,选择您的数据库,然后单击“文件格式”
  • 创建新的文件格式
    • 单击“创建”按钮或“创建文件格式”选项以启动创建过程。
  • 定义文件格式属性
    • 输入您要用于文件格式的名称。
    • 选择要创建的文件格式类型(例如,CSV、JSON、AVRO、ORC、PARQUET、XML)。
    • 配置与所选文件类型相关的特定选项。这些选项包括字段分隔符、空值表示或分层数据处理设置。
  • 保存文件格式
    • 查看配置的设置。
    • 单击“保存”以完成并创建文件格式。

创建命名文件格式

您可以使用两种主要方法创建命名文件格式:Snowflake Web 界面(Snowsight 或经典控制台)和 SQL 命令。每种方法都提供了不同的配置和管理文件格式的方法。

通过 Snowsight 创建命名文件格式

  1. 导航到数据库
    • 登录 Snowflake Web 界面。
    • 从主菜单中选择数据,然后选择数据库
  2. 选择数据库和架构
    • 找到要创建文件格式的数据库。
    • 选择将存储文件格式的架构。
  3. 创建文件格式
    • 点击创建,然后从下拉菜单中选择文件格式
    • 结构将出现,您可以在其中输入文件格式所需的详细信息。
  4. 完成 SQL 语句
    • 填写表单,提供文件格式所需的信息。这通常包括指定文件格式的类型(例如,CSV、JSON、AVRO 等)以及配置任何特定于格式的选项。
    • 完成配置后,单击创建文件格式以完成并保存您的设置。

通过经典控制台创建命名文件格式

导航到数据库

  • 登录 Snowflake Web 界面。
  • 从主菜单中选择数据库选项卡。

选择文件格式

  • 选择要创建文件格式的数据库。
  • 单击所选数据库下的文件格式部分。

创建文件格式

  • 单击创建,然后在出现的对话框中完成提示。
  • 提供文件格式所需的详细信息,包括类型和与格式相关的任何特定选项。

使用 SQL 创建命名文件格式

您还可以使用 SQL 命令创建命名文件格式。此方法对于自动化和脚本编写非常有用。创建文件格式的通用 SQL 语法是

将 <file_format_name> 替换为您要分配给文件格式的名称,将 <format_type> 替换为文件格式的类型(例如,“CSV”、“JSON”、“AVRO”),并添加格式所需的任何特定选项或参数。

使用命名文件格式的好处

  • 一致性: 确保不同数据加载操作之间配置的一致性。
  • 效率: 通过重用预定义格式简化数据加载过程。
  • 减少错误: 最大限度地减少文件处理中的配置错误和差异。
  • Snowflake 中的命名文件格式提供了一种简化数据文件配置管理的方法,从而提高了数据加载过程的效率和一致性。

覆盖默认文件格式和 COPY 选项

在 Snowflake 中,虽然命名文件格式提供了一种标准化处理文件格式的方法,但您可能偶尔需要为特定的数据加载操作覆盖这些默认设置。这提供了灵活性和自定义功能,使您能够解决独特的数据处理要求并处理异常。

默认文件格式

  • Snowflake 中的命名文件格式定义了处理文件的默认选项。这些默认值包括分隔符、编码和其他特定于格式的配置的设置。
  • 创建文件格式包括普遍适用于使用该格式处理的文件的选项。

覆盖默认文件格式选项

加载数据时,您可以直接在 COPY INTO 命令中覆盖命名文件格式的默认设置。如果您需要为特定文件或数据集调整格式而无需修改命名文件格式本身,这将非常有用。

覆盖默认文件格式选项的语法

示例 1:覆盖 JSON 文件格式的默认选项

如果默认 JSON 文件格式期望 UTF-8 编码,但您的文件采用不同的编码,您可以在 COPY INTO 命令中直接指定编码

覆盖 COPY 选项

除了覆盖默认文件格式选项外,您还可以指定各种 COPY INTO 命令选项以自定义数据加载过程。这些选项包括处理错误、管理文件压缩和控制数据解析行为。

  • ON_ERROR: 确定在加载过程中遇到错误时要采取的操作。
    • CONTINUE: 跳过有错误的行并继续处理。
    • ABORT_STATEMENT: 如果发生错误,则中止整个 COPY INTO 操作。
  • MAX_FILE_SIZE: 指定要加载的最大可能文件。用于管理大文件。
  • COMPRESSION: 指定用于数据文件的压缩类型。
    • 选项包括 AUTO、GZIP、BZIP2、LZO 和 BROTLI。
  • TRIM_SPACE: 确定是否应从字段中删除前导和尾随空格。
    • 选项为 TRUE 或 FALSE。

覆盖 COPY 选项的语法

覆盖 Snowflake 中的默认文件格式和 COPY INTO 选项提供了处理特定数据加载场景和根据需要自定义处理的灵活性。通过有效利用这些覆盖,您可以适应文件格式的差异,管理错误,并确保数据准确高效地加载到 Snowflake 表中。