Enable automatic table schema evolution¶
半结构化数据往往会随着时间的推移而演化。生成数据的系统会添加新列以容纳更多信息,这就要求下游表也要相应地演化。
Snowflake 中的表结构可以自动演化,以支持从数据源接收的新数据结构。Snowflake 支持以下操作:
自动添加新列。
自动从新数据文件中缺少的列删除 NOT NULL 约束。
要启用表模式演化,请执行以下操作:
如果要创建新表,请在使用 CREATE TABLE 命令时将
ENABLE_SCHEMA_EVOLUTION参数设置为 TRUE。对于现有表,请使用 ALTER TABLE 命令修改表,并将
ENABLE_SCHEMA_EVOLUTION参数设置为 TRUE。
当满足以下所有条件时,从文件加载数据会演化表列:
Snowflake 表的
ENABLE_SCHEMA_EVOLUTION参数已设置为 TRUE。COPY INTO <table> 语句使用
MATCH_BY_COLUMN_NAME选项。用于加载数据的角色对表具有 EVOLVE SCHEMA 或 OWNERSHIP 权限。
此外,对于 CSV 的架构演化,当与 MATCH_BY_COLUMN_NAME 和 PARSE_HEADER 一起使用时,必须将 ERROR_ON_COLUMN_COUNT_MISMATCH 设置为 false。
架构演化虽是一项独立功能,但可以与架构检测支持结合使用,以从云存储中的一组文件中 检索列定义的。这些功能结合使用时,允许连续数据管道从云存储中的一组数据文件创建新表,然后,随着新源数据文件的架构演化(增加或删除列)修改表中的列。
使用说明¶
此功能支持 Apache Avro、Apache Parquet、CSV、JSON 和 ORC 文件。
此功能只能用于 COPY INTO <table> 语句和 Snowpipe 数据加载。INSERT 操作不能自动使目标表架构演化。
架构演化不支持直接使用 Snowflake Ingest :doc:` 的 </user-guide/snowpipe-streaming/data-load-snowpipe-streaming-overview>Snowpipe Streaming
SDK 数据加载。:doc:`具有 Snowpipe Streaming 的 Kafka Connector </user-guide/snowpipe-streaming/snowpipe-streaming-classic-kafka-schema-detection>支持架构检测和演化。默认情况下,此功能在每个 COPY 操作中最多只能添加 100 列,或只能使 1 个架构演化。要请求在每个 COPY 操作中添加超过 100 列或使多于 1 个的架构演化,请联系 Snowflake 支持部门。
删除 NOT NULL 列约束没有限制。
架构演化通过以下视图和命令中的
SchemaEvolutionRecord输出进行跟踪:INFORMATION_SCHEMA COLUMNS 视图、ACCOUNT_USAGE COLUMNS 视图、DESCRIBE TABLE 命令 以及 SHOW COLUMNS 命令。然而,对于带有 Snowpipe Streaming 的 Kafka 连接器,架构演化不会被
SchemaEvolutionRecord输出跟踪。SchemaEvolutionRecord输出始终显示 NULL。当在架构演化后手动重命名或修改列时,架构演化记录将被清除。
任务 不支持架构演化。
架构演化支持:引入方法比较¶
特定的元数据字段 SchemaEvolutionRecord 用于跟踪架构演化。您可以使用 INFORMATION_SCHEMA.COLUMNS 视图、DESCRIBE TABLE 命令 以及 SHOW COLUMNS 命令 查看此字段。
下表总结了不同 Snowflake 引入方法的架构演变支持及相应的 SchemaEvolutionRecord 跟踪行为:
引入方法 |
架构或上下文 |
架构演化支持状态 |
SchemaEvolutionRecord 跟踪行为 |
|---|---|---|---|
基于文件(批处理/微批处理) |
完全受支持 |
在跟踪视图/命令中可见。 |
|
基于文件(批处理/微批处理) |
使用自动加载的 Snowpipe |
完全受支持 |
在跟踪视图或命令中可见。 |
行级别流式处理 |
:doc:`Snowpipe Streaming </user-guide/snowpipe-streaming/data-load-snowpipe-streaming-overview>`(高性能架构) |
完全受支持 |
在跟踪视图或命令中可见。 |
行级别流式处理 |
采用经典架构的 Snowpipe Streaming;例如,Kafka Connector |
仅支持 带有 Kafka Connector 经典架构,且跟踪受限。 |
在跟踪视图或命令中始终显示 NULL。 |
示例¶
下面的示例创建一个表,其列定义来自一组 Parquet 数据。如果为该表启用自动表模式演化,则进一步从包含其他名称/值对的 Parquet 文件加载数据会自动在该表中添加列:
请注意,语句中引用的 mystage 暂存区和 my_parquet_format 文件格式必须已存在。一组文件必须已暂存在暂存区定义中引用的云存储位置中。
本例以 INFER_SCHEMA 主题中的一个示例为基础: