如何消除DataFrame中null值的双引号?Snowflake Parquet加载异常处理
问题:空字符串转null后在Snowflake中显示为带引号的"null"
我尝试将DataFrame中的空字符串替换为null,通过awswrangler将其转换为Parquet文件并写入S3。该Parquet文件在Snowflake中以JSON格式加载后,null值显示为带双引号的"null",而非JSON原生的无引号null。
预期JSON输出(无双引号的null)
{'name': 'Jane', 'age': '25', 'city': null}
尝试的代码
import json import pandas as pd import numpy as np df = pd.DataFrame({ "name": ["John", "Jane", "Raj", "Mike"], "age": [30, 25, "", 35], "city": ["New York", "", "", "Chicago"] }) metadata = { "eventVersion": "3", "producedBy": "Service", } json_list = [] column_names = df.columns.tolist() for _, row in df.iterrows(): payload_dict = row.to_dict() for key, value in payload_dict.items(): if value == '': payload_dict[key] = 'null' elif isinstance(value, float): payload_dict[key] = '{:.2f}'.format(value).rstrip('0').rstrip('.') else: payload_dict[key] = str(value) output_dict = {} output_dict.update(metadata) output_dict['payload'] = payload_dict json_list.append(output_dict) df_final = pd.DataFrame(json_list) for _, row in df_final.iterrows(): print(row) output_file_name = output_path+'parquet/'+fn.replace('csv','parquet') awswrangler.s3.to_parquet(df_final, f's3://{input_bucket}/{output_file_name}', dataset=False, index=False)
问题排查与解决方案
问题根源
代码中将空字符串替换为了字符串类型的'null',而非Python中的None。Parquet会把这个字符串值原样存储,Snowflake加载时自然将其识别为带双引号的字符串,而非JSON原生的null。
修复步骤
- 将空字符串替换为Python的
None,它会被正确映射为Parquet的null类型,最终在Snowflake中解析为无引号的JSON null。 - 移除不必要的强制类型转换(比如把整数转成字符串),保留原数据类型,确保Parquet存储正确的类型信息,避免后续类型解析问题。
修改后的代码
import pandas as pd import awswrangler df = pd.DataFrame({ "name": ["John", "Jane", "Raj", "Mike"], "age": [30, 25, "", 35], "city": ["New York", "", "", "Chicago"] }) metadata = { "eventVersion": "3", "producedBy": "Service", } json_list = [] for _, row in df.iterrows(): payload_dict = row.to_dict() for key, value in payload_dict.items(): if value == '': # 替换空字符串为Python的None,对应JSON的null payload_dict[key] = None # 保留数值类型,仅处理可能的浮点数格式需求(如果需要) elif isinstance(value, float): # 若不需要格式化浮点数,可直接跳过此分支 payload_dict[key] = round(value, 2) if value % 1 != 0 else int(value) output_dict = {} output_dict.update(metadata) output_dict['payload'] = payload_dict json_list.append(output_dict) df_final = pd.DataFrame(json_list) output_file_name = output_path+'parquet/'+fn.replace('csv','parquet') awswrangler.s3.to_parquet(df_final, f's3://{input_bucket}/{output_file_name}', dataset=False, index=False)
补充说明
- Python的
None在Parquet中会被存储为null类型,Snowflake加载JSON时会自动解析为无引号的null。 - 保留原数据类型(如整数、字符串)能让Parquet和Snowflake更好地识别字段类型,避免不必要的类型转换问题。
内容的提问来源于stack exchange,提问作者marjun
相关产品推荐
相关产品推荐

