准备数据文件

本主题提供准备加载数据文件的最佳实践、一般准则和重要注意事项。

本主题内容:

文件大小调整最佳实践

为了获得最佳加载性能并避免 大小限制,请考虑以下数据文件大小调整准则。请注意,这些建议适用于使用 Snowpipe 进行批量数据加载和连续加载。

常规文件大小调整建议

并行运行的加载操作数不能超过要加载的数据文件数。为了优化负载的并行操作数,建议生成的数据文件 压缩大小 约为 100-250 MB(或更大)。

备注

不建议加载非常大的文件(例如,100 GB 或更大)。

如果必须加载大文件,则仔细考虑 ON_ERROR 复制选项值。由于少量错误而中止或跳过文件可能会导致延迟和浪费 Credit。此外,如果数据加载操作继续超过允许的最大持续时间 24 小时,则该操作可能会被中止,而不会提交文件的任何部分。

聚合较小的文件可以尽可能减少每个文件的处理开销。将较大的文件拆分为更多较小的文件,以便在活跃仓库中的计算资源之间分发负载。并行处理的数据文件数由仓库中的计算资源量决定。我们建议按行拆分大文件,以避免出现跨块记录的情况。

如果您的数据源不允许以较小的区块导出数据文件,则可以使用第三方实用程序拆分大型 CSV 文件。

如果您正在加载符合 RFC4180 规范的大型未压缩的 CSV 文件(大于 128MB),则当 MULTI_LINE 设置为 FALSE、COMPRESSION 设置为 NONE,并且 ON_ERROR 设置为 ABORT_STATEMENTCONTINUE 时,Snowflake 支持对这些 CSV 文件进行并行扫描。

Linux 或 macOS

split 实用程序使您能够将文件 CSV 拆分为多个较小的文件。

语法:

split [-a suffix_length] [-b byte_count[k|m]] [-l line_count] [-p pattern] [file [name]]
Copy

有关详细信息,请在终端窗口中键入 man split

示例:

split -l 100000 pagecounts-20151201.csv pages
Copy

本示例按行的长度拆分名为 pagecounts-20151201.csv 的文件。假设单个大文件为 8 GB 并包含 1000 万行。除以 100,000,则 100 个较小的文件中的每一个大小为 80 MB (1000 万/100,000 = 100)。拆分的文件名为 pagessuffix

Windows

Windows 不包括本机文件拆分实用程序。但 Windows 支持许多可以拆分大型数据文件的第三方工具和脚本。

数据库对象的大小限制

当您使用任何可用方法 将数据加载到 Snowflake 中时,可以存储大小不超过以下限制的对象:

数据类型

存储限制

ARRAY

128 MB

BINARY

64 MB

GEOGRAPHY

64 MB

GEOMETRY

64 MB

OBJECT

128 MB

VARCHAR

128 MB

VARIANT

128 MB

VARCHAR 列的默认大小为 16 MB(二进制为 8 MB)。要创建列大小超过 16 MB 的表,请显式指定大小。例如:

CREATE OR REPLACE TABLE my_table (
  c1 VARCHAR(134217728),
  c2 BINARY(67108864));
Copy

要为 VARCHAR 列使用新限制,可以更改表以更改列大小。例如:

ALTER TABLE my_table ALTER COLUMN col1 SET DATA TYPE VARCHAR(134217728);
Copy

要将新大小应用于这些表中的 BINARY 类型的列,请重新创建表。您无法更改现有表中 BINARY 列的长度。

对于类型为 ARRAY、GEOGRAPHY、GEOMETRY、OBJECT 和 VARIANT 的列,默认可在现有表和新表中存储大于 16 MB 的对象,而无需指定长度。例如:

CREATE OR REPLACE TABLE my_table (c1 VARIANT);
Copy

如果您的过程和函数是过去创建的,并且使用 VARIANT、VARCHAR、或 BINARY 值作为输入,则可能需要重新创建它们(未指定长度),以支持大于 16 MB 的对象。例如:

CREATE OR REPLACE FUNCTION udf_varchar(g1 VARCHAR)
  RETURNS VARCHAR
  AS $$
    'Hello' || g1
  $$;
Copy

对于外部托管 Iceberg 表,VARCHAR 和 BINARY 列的默认长度为 128 MB。此默认长度适用于新创建的表或刷新的表。如果您有过去创建的表,那么这些表可能适用较小的限制。您可以刷新这些表,使其支持更大的大小限制。

对于托管 Iceberg 表,VARCHAR 和 BINARY 列的默认长度为 128 MB。在启用新大小限制之前创建的表仍具有以前的默认长度。要将新大小应用于这些表中的 VARCHAR 类型的列,请重新创建表或更改列。以下示例更改列以使用新的大小限制:

ALTER ICEBERG TABLE my_iceberg_table ALTER COLUMN col1 SET DATA TYPE VARCHAR(134217728);
Copy

要将新大小应用于这些表中的 BINARY 类型的列,请重新创建表。您无法更改现有表中 BINARY 列的长度。

支持结果集中大型对象的驱动程序版本

驱动程序支持大于 16 MB 的对象(BINARY、GEOMETRY 和 GEOGRAPHY 为 8 MB)。可能需要将驱动程序更新到支持较大对象的版本。需要以下驱动程序版本:

驱动程序

支持的最低版本

发布日期

Snowpark Library for Python

1.21.0

2024 年 8 月 19 日

Snowflake Connector for Python

3.10.0

2024 年 4 月 29 日

JDBC

3.17.0

2024 年 7 月 8 日

ODBC

3.6.0

2025 年 3 月 17 日

Go Snowflake 驱动程序

1.1.5

2022 年 4 月 17 日

.NET

2.0.11

2022 年 3 月 15 日

Snowpark Library for Scala 和 Snowpark Library for Java

1.14.0

2024 年 9 月 14 日

Node.js

1.6.9

2022 年 4 月 21 日

Spark Connector

3.0.0

2024 年 7 月 31 日

PHP

3.0.2

2024 年 8 月 29 日

SnowSQL

1.3.2

2024 年 8 月 12 日

如果尝试使用不支持较大对象的驱动程序,则会返回与以下示例类似的错误:

100067 (54000): The data length in result column <column_name> is not supported by this version of the client.
Actual length <actual_size> exceeds supported length of 16777216.

连续数据加载 – 即 Snowpipe – 和文件大小调整

Snowpipe 会在发送文件通知后的一分钟内加载新数据。但是,对于非常大的文件,或者在需要异常数量的计算资源来解压缩、解密和转换新数据的情况下,加载可能需要更长的时间。

除了资源消耗之外,管理内部加载队列中的文件的开销也包含在 Snowpipe 的使用成本中。此开销会随着排队加载的文件数而增加。此开销会在账单中显示为 Snowpipe 费用,因为自动外部表刷新的事件通知会使用 Snowpipe。

为了使用 Snowpipe 获得更高效和更具成本效益的加载体验,建议遵循 :ref:`label-data_load_file_sizing_best_practices`(本主题内容)中的文件大小建议。加载约为 100-250 MB 或更大的数据文件,可以显著降低相对于加载的总数据量的开销,以至于这部分额外成本变得几乎可以忽略不计。

如果在源应用程序中累积 MBs 数据所需的时间超过一分钟,可考虑每分钟创建一个新的(可能更小的)数据文件。这种方法通常可以在成本(即用于 Snowpipe 队列管理和实际负载的资源)和性能(即负载延迟)之间实现良好的平衡。

创建较小的数据文件并将其暂存到云存储中的频率超过每分钟一次,具有以下缺点:

  • 无法保证减少暂存和加载数据之间的延迟。

  • 管理内部加载队列中文件的开销包含在 Snowpipe 的使用成本中。此开销会随着排队加载的文件数而增加。

各种工具可以聚合和批处理数据文件。一个方便的选择是 Amazon Data Firehose。Firehose 允许定义所需的文件大小(称为 缓冲区大小)和发送新文件(在本例中为云存储)之后的等待间隔(称为 缓冲区间隔)。有关更多信息,请参阅 Amazon Data Firehose 文档 (https://docs.aws.amazon.com/firehose/latest/dev/create-configure.html)。如果源应用程序通常会在一分钟内积累足够的数据来填充大于建议的最大值的文件,以实现最佳并行处理,则可以减小缓冲区大小以触发较小文件的传递。将缓冲间隔设置保持在 60 秒(最小值)有助于避免创建过多文件或增加延迟。

准备带分隔符的文本文件

在准备要加载的带分隔符的文本 (CSV) 文件时,请考虑以下准则:

  • UTF-8 是默认字符集,但支持其他编码。使用 ENCODING 文件格式选项指定数据文件的字符集。有关更多信息,请参阅 CREATE FILE FORMAT

  • 包含分隔符的字段放在引号(单引号或双引号)内。如果数据包含单引号或双引号,则必须对这些引号进行转义。

  • 回车符通常在 Windows 系统上与换行符一起引入,以标记行尾 (\r \n)。包含回车符的字段也应放在引号(单引号或双引号)内。

  • 每行中的列数应保持一致。

半结构化数据文件和子列化

将半结构化数据插入 VARIANT 列中时,Snowflake 会使用某些规则将尽可能多的数据提取为列形式。其余数据作为单个列存储在解析的半结构化结构中。

默认情况下,Snowflake 每个分区、每个表最多提取 200 个元素。要提高此限制,请联系 Snowflake 支持部门

未提取的元素

具有以下特征的元素 不会 提取到列中:

  • 即使包含单个“null”值的元素也不会提取到列中。这适用于具有“null”值的元素,而不适用于以列形式表示的缺少值的元素。

    此规则可确保不会丢失任何信息(即,VARIANT“null”值和 SQL NULL 值之间的差异不会丢失)。

  • 包含多种数据类型的元素。例如:

    一行中的 foo 元素包含一个数字:

    {"foo":1}
    
    Copy

    另一行中的同一元素包含一个字符串:

    {"foo":"1"}
    
    Copy

提取如何影响查询

当您查询半结构化元素时,Snowflake 的执行引擎的表现会根据是否提取元素而有所不同。

  • 如果元素已提取到列中,则引擎仅扫描提取的列。

  • 如果 将元素提取到列中,则引擎必须扫描整个 JSON 结构,然后对每一行遍历结构以输出值,从而影响性能。

为避免对未提取的元素产生性能影响,请执行以下操作:

  • 在加载 ,将包含“null”值的半结构化数据元素提取到关系列中。

    或者,如果文件中的“null”值表示缺失值并且没有其他特殊含义,建议在加载半结构化数据文件时将 文件格式选项 STRIP_NULL_VALUES 设置为 TRUE。此选项将删除 OBJECT 元素或包含“null”值的 ARRAY 元素。

  • 确保每个唯一元素只存储该格式原生支持的单个数据类型(例如,对于 JSON 格式,可以是字符串或数字)。

数值数据准则

  • 避免使用嵌入字符,例如逗号(例如,123,456)。

  • 如果一个数字包含小数部分,则应使用小数点将其与整数部分分隔开(例如,123456.789)。

  • 仅限 Oracle。Oracle NUMBER 或 NUMERIC 类型允许任意小数位数,这意味着即使在定义数据类型时没有指定精度或小数位数,它们也接受带有小数部分的值。而在 Snowflake 中,为具有小数部分的值设计的列必须使用小数位数定义以保留小数部分。

日期和时间戳数据准则

  • 有关日期、时间和时间戳数据支持的格式的信息,请参见 日期和时间输入和输出格式

  • 仅限 Oracle。Oracle DATE 数据类型可以包含日期 时间戳信息。如果您的 Oracle 数据库包含还存储时间相关信息的 DATE 列,请将这些列映射到 Snowflake 中的 TIMESTAMP 数据类型,而不是 DATE。

备注

Snowflake 在加载时检查时态数据值。无效的日期、时间和时间戳值(例如,0000-00-00)会产生错误。

语言: 中文