Snowpark/Snowflake计算列空值占比报错,求筛选低空值列方案
解决Snowpark识别高空值占比列并移除的问题
问题说明
需要识别表中空值占比超过90%的列并移除,最终返回未被移除的列列表或空表,但现有Snowpark代码运行报错。
报错信息
00357 (P0000): Python Interpreter Error: Traceback (most recent call last): File "_udf_code.py", line 23, in main File "/usr/lib/python_udf/81026afe07d5ccb2100e9e480aaccb104b6644cbe92cb335909de3e6bad43727/lib/python3.8/site-packages/snowflake/snowpark/dataframe.py", line 884, in __getattr__ raise AttributeError( AttributeError: Table object has no attribute isnull in function PYTHON_WORKSHEET with handler main
报错原因
Snowpark的DataFrame(Table对象)不支持Pandas的isnull()方法,该方法为Pandas专属,无法直接在Snowpark中调用。
正确实现代码
使用Snowpark原生函数统计空值占比,筛选并移除高空值列:
import snowflake.snowpark as snowpark from snowflake.snowpark.functions import col, count def main(session: snowpark.Session): tableName = 'schema.table' df = session.table(tableName) # 获取表的总行数 total_rows = df.count() # 处理空表情况 if total_rows == 0: return session.create_dataframe([], schema=df.schema) # 统计每列的非空值数量 non_null_counts = df.agg(*[count(col(c)).alias(c) for c in df.columns]) # 将聚合结果转为字典便于计算 non_null_dict = non_null_counts.collect()[0].as_dict() # 筛选空值占比超过90%的列 high_null_cols = [ col_name for col_name, non_null_num in non_null_dict.items() if (total_rows - non_null_num) / total_rows > 0.9 ] # 保留未被标记的列 remaining_cols = [col_name for col_name in df.columns if col_name not in high_null_cols] # 返回结果:无剩余列则返回空表,否则返回筛选后的DataFrame if not remaining_cols: return session.create_dataframe([], schema=[]) return df.select(remaining_cols)
代码关键点
- 用
df.count()获取总行数,提前处理空表场景 - 通过
agg()结合count()统计每列非空值数量(count()会自动忽略NULL值) - 计算空值占比:
(总行数 - 非空值数) / 总行数,判断是否超过90%阈值 - 筛选剩余列,返回对应结果,确保无剩余列时返回合法空表
测试验证
测试表创建语句
CREATE OR REPLACE TABLE TAB(Q INT, X VARCHAR, Y INT, Z INT) AS SELECT NULL, '0041X00002OEkZ5QAL', 2, NULL UNION ALL SELECT NULL, NULL, NULL, NULL UNION ALL SELECT NULL, NULL, NULL, NULL UNION ALL SELECT NULL, NULL, 2, NULL;
(注:原测试语句中X列值为字符串,需添加单引号避免语法错误)
测试结果
各列空值占比:
- Q列:4行全空 → 100% → 被移除
- X列:1行非空,3行空 → 75% → 保留
- Y列:2行非空,2行空 → 50% → 保留
- Z列:4行全空 → 100% → 被移除
最终返回的列列表为X、Y。
内容的提问来源于stack exchange,提问作者0004
相关产品推荐
相关产品推荐

