求助:将AWS Glue动态框架写入Snowflake时列数据乱序
解决AWS Glue动态框架写入Snowflake列数据错位问题
问题原因
默认情况下,Glue的write_dynamic_frame.from_options写入Snowflake时,是按字段顺序而非字段名称匹配目标表的列。如果你的动态框架字段顺序和Snowflake目标表的列顺序不一致,就会出现数据错位到其他列的情况。
解决方案
方法1:显式指定列映射
在connection_options中添加"columnmapping"参数,明确对应动态框架字段和Snowflake表列的映射关系,示例如下:
snowflake_table_result = glueContext.write_dynamic_frame.from_options( frame=dataframe, connection_type="snowflake", connection_options={ "autopushdown": "on", "dbtable": "TABLE", "preactions": f"DELETE FROM DB.SCHEMA.TABLE WHERE data = 'old';", "connectionName": "Snowflake connection", "sfDatabase": f"DB", "sfSchema": "SCHEMA", # 显式指定列映射,格式:动态框架字段:Snowflake列名 "columnmapping": "A:A,B:B,C:C" } )
注意:Snowflake的列名如果是创建时未加引号的,默认是大写,映射时要保持名称大小写一致(比如动态框架字段是小写a,Snowflake列是大写A,就要写成a:A)。
方法2:调整动态框架的字段顺序
确保动态框架的字段顺序和Snowflake目标表的列顺序完全一致。可以通过SelectFields转换动态框架来调整顺序,示例:
from awsglue.transforms import SelectFields # 按Snowflake表列顺序选择动态框架字段 ordered_frame = SelectFields.apply( frame=dataframe, paths=["A", "B", "C"] # 这里的顺序要和Snowflake表列顺序完全匹配 ) # 再写入Snowflake snowflake_table_result = glueContext.write_dynamic_frame.from_options( frame=ordered_frame, connection_type="snowflake", connection_options={ "autopushdown": "on", "dbtable": "TABLE", "preactions": f"DELETE FROM DB.SCHEMA.TABLE WHERE data = 'old';", "connectionName": "Snowflake connection", "sfDatabase": f"DB", "sfSchema": "SCHEMA" } )
方法3:禁用临时 staging 表(可选)
如果使用默认的临时 staging 表写入方式,也可能因字段顺序问题导致错位,可以尝试添加"usestagingtable": "off"参数关闭该功能,直接写入目标表:
snowflake_table_result = glueContext.write_dynamic_frame.from_options( frame=dataframe, connection_type="snowflake", connection_options={ "autopushdown": "on", "dbtable": "TABLE", "preactions": f"DELETE FROM DB.SCHEMA.TABLE WHERE data = 'old';", "connectionName": "Snowflake connection", "sfDatabase": f"DB", "sfSchema": "SCHEMA", "usestagingtable": "off" } )
内容的提问来源于stack exchange,提问作者MyJBMe
相关产品推荐
相关产品推荐

