Snowpark查询报错:列名转为大写后无法识别求助
解决Snowpark查询时列名被转为大写导致的无效标识符问题
问题分析
你遇到的核心问题是:Snowpark的col()函数默认会将传入的列名转为大写并包裹双引号,生成大小写敏感的SQL查询;而你在Snowflake工作表中使用无引号的Country时,Snowflake会自动将其转为大写去匹配存储的列名(未加双引号创建的列默认存储为大写),因此能正常执行。
解决方案
提供两种可行的解决方式,覆盖不同场景:
方式1:使用字符串形式的过滤条件
直接写原生SQL风格的过滤字符串,让Snowflake自行处理大小写匹配,避免Snowpark对列名进行规范化处理:
snow_session.table("economy.data_atlas").filter("Country = 'United Arab Emirates'")
生成的SQL与你在工作表中执行的一致:
SELECT * FROM economy.data_atlas WHERE Country = 'United Arab Emirates'
方式2:使用quoted_name保留列名原大小写
如果你的列名是创建时用双引号定义的大小写敏感名称(比如"Country"),可以用quoted_name函数强制保留原列名的大小写:
from snowflake.snowpark.functions import quoted_name snow_session.table("economy.data_atlas").filter(quoted_name("Country", case_sensitive=True) == "United Arab Emirates")
生成的SQL会保留原列名的大小写:
SELECT * FROM economy.data_atlas WHERE "Country" = 'United Arab Emirates'
补充说明
Snowflake的标识符规则:
- 创建列时未加双引号:列名会自动转为大写存储,查询时大小写不敏感(写
Country/COUNTRY/country都能匹配)。 - 创建列时加双引号:列名会严格保留大小写,查询时必须用双引号且完全匹配。
Snowpark的col()函数默认行为是规范化列名(转大写+加双引号),这就导致当实际列名是大小写混合的敏感名称时,生成的SQL会匹配不到;而字符串过滤方式会跳过这个规范化步骤,让Snowflake按默认规则处理大小写。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

