开启Schema Evolution时,Snowflake COPY INTO添加额外列的限制问询
Snowflake COPY INTO 开启Schema Evolution时添加自定义额外列的问题解答
问题1:开启Schema Evolution时,能否添加INCLUDE_METADATA之外的自定义额外列?
可以。当显式指定SCHEMA_EVOLUTION=TRUE(COPY INTO默认不开启该参数)时,除了通过INCLUDE_METADATA引入Snowflake内置元数据列(如METADATA$START_SCAN_TIME),还能直接在COPY语句中定义自定义常量列或基于表达式生成的列——如果目标表原本不存在这些列,Schema Evolution会自动将其添加到表结构中。
比如你示例里的RECORD_SOURCE='BUSINESS_UNIT'就是合法的自定义常量列,这类列完全独立于源Parquet文件的结构,由COPY过程直接生成并写入目标表。
问题2:添加自定义额外列的限制
- 定义规则限制:自定义列只能是常量值(如字符串、数值)或基于内置元数据列/系统函数的可计算表达式,不能引用源数据文件中不存在的字段(固定常量除外)。
- 列名冲突限制:自定义列的名称不能与源表字段、内置元数据列(如
METADATA$FILENAME)或目标表已存在的列重名,否则会触发列名冲突错误。 - 数据类型兼容性限制:若后续执行COPY时,同一自定义列的定义数据类型与首次写入的类型不兼容(比如第一次写字符串
'BUSINESS_UNIT',后续写数值123),会导致写入失败;若目标表已预先创建该列,自定义列的类型必须与目标表列类型匹配。 - 默认值优先级限制:如果目标表已存在该自定义列且设置了默认值,COPY语句中定义的自定义列值会覆盖表列的默认值,不会使用表的默认配置。
- Schema Evolution触发条件:只有当目标表不存在该自定义列时,Schema Evolution才会自动添加;若目标表已存在该列,仅执行数据写入,不会修改列结构。
修正后的示例代码
COPY INTO DATABASE.SCHEMA.TABLE2 FROM DATABASE.SCHEMA.TABLE1 FILE_FORMAT=DATABASE.SCHEMA.PARQUET_FILE_FORMAT ON_ERROR=CONTINUE MATCH_BY_COLUMN_NAME=CASE_INSENSITIVE SCHEMA_EVOLUTION=TRUE -- 显式开启Schema Evolution INCLUDE_METADATA( _METADATA_FILENAME=METADATA$FILENAME, _METADATA_FILE_LAST_MODIFIED=METADATA$FILE_LAST_MODIFIED ) -- 添加自定义常量列 , RECORD_SOURCE='BUSINESS_UNIT' , SYSTEM_SOURCE='SNOWFLAKE_COPY' , SYSTEM_MODULE='DATA_INTEGRATION'
内容的提问来源于stack exchange,提问作者ADom
相关产品推荐
相关产品推荐

