如何使用Polars DataFrame排除JSON输出中的空值字段?
解决Polars处理BigQuery表输出无空值嵌套JSON的问题
直接上可行方案,核心思路是把每行数据转成Python字典后递归清理空值字段,再用原生JSON序列化输出,避开Polars Struct保留空字段和JSON转义的问题:
步骤1:定义递归清理空值的函数
这个函数会处理所有嵌套层级的字典、列表,去掉空值、空字典、空列表对应的字段/元素:
def clean_null_fields(data): if isinstance(data, dict): # 只保留值不为None、非空字典、非空列表的键 return { k: clean_null_fields(v) for k, v in data.items() if v is not None and v != {} and v != [] } elif isinstance(data, list): # 清理列表里的空元素,同时递归处理每个元素 return [clean_null_fields(item) for item in data if item is not None] else: # 基础类型直接返回 return data
步骤2:读取并处理数据
用Polars读取BigQuery表后,逐行转字典、清理空值,再输出无转义的JSON:
import polars as pl import json # 替换成你的BigQuery表路径 df = pl.read_bigquery("your-project.your-dataset.your-table") # 输出到控制台(如果要存文件就用下方注释的文件写入逻辑) for row in df.iter_rows(named=True): cleaned_row = clean_null_fields(row) # json.dumps直接序列化清理后的字典,无转义字符 print(json.dumps(cleaned_row)) # 保存到JSON Lines文件的写法 # with open("output.jsonl", "w") as f: # for row in df.iter_rows(named=True): # cleaned_row = clean_null_fields(row) # f.write(json.dumps(cleaned_row) + "\n")
为什么这个方案能解决你的问题
- 避开
str.json_decode()的坑:Polars的Struct类型会因为其他行存在某个字段而保留所有行的该字段(哪怕是空值),直接用iter_rows(named=True)转成Python字典,就能灵活删除空值键。 - 无转义JSON:用
json.dumps()序列化原生Python字典,不会出现转义字符,比Polars自带的JSON输出更可控。 - 全层级清理:递归函数能处理嵌套的Struct、List,不管多少层的空值字段都能去掉。
可选调整
- 如果想保留空字典/空列表,把函数里的
v != {} and v != []去掉就行,只保留v is not None。 - 数据量极大时,
iter_rows是逐行处理,内存占用低,适合大数据场景。
内容的提问来源于stack exchange,提问作者programmingtech
相关产品推荐
相关产品推荐

