You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何消除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。

修复步骤

  1. 将空字符串替换为Python的None,它会被正确映射为Parquet的null类型,最终在Snowflake中解析为无引号的JSON null。
  2. 移除不必要的强制类型转换(比如把整数转成字符串),保留原数据类型,确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:43:17