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

如何将PySpark DataFrame转为无数字引号、无日期多余反斜杠的JSON列表

PySpark DataFrame 转符合API要求的JSON列表实现方案

问题说明

原有通过toPandas()再调用pandasto_json()的转换方式存在两类格式错误:

  • 数值类型字段被自动添加双引号转为字符串,例如数值123456输出为"123456"、数值0输出为"0"
  • 日期类型字段的正斜杠被多余转义,例如日期3/20/1943输出为"3\/20\/1943"

推荐方案:使用PySpark原生能力转换(无类型损失、性能更好)

不需要绕道Pandas,直接基于PySpark内置方法配合Python标准JSON库转换,从根源避免类型错误和多余转义:

import json

# 逐行转换为JSON字符串后解析为Python字典,组成API需要的列表结构
results = [json.loads(row.json()) for row in loan_detail_df.collect()]

# 如果需要直接得到可传入API的JSON字符串,执行以下代码
results_json = json.dumps(results, ensure_ascii=False)

该方案的优势:

  • 自动继承PySpark DataFrame的schema定义,数值类型字段会保留为JSON数值格式,不会被加双引号
  • 标准JSON库默认不会转义正斜杠,日期字符串会原样输出,不会出现多余反斜杠
  • 避免了toPandas()把全量数据拉到Driver端的内存开销,大数据量下稳定性更好

备选方案:修正Pandas链路的转换逻辑

如果业务场景必须先转换为Pandas DataFrame,按以下步骤调整代码即可解决格式问题:

  1. 提前将数值类字段转换为Pandas对应数值类型,避免被识别为字符串
  2. 关闭pandasto_json()方法默认的正斜杠转义配置
    示例代码:
import pandas as pd
import json

loan = loan_detail_df.toPandas()
# 替换为实际的数值字段名,将字段转为数值类型
numeric_cols = ["Number", "ExpectedRate"]
loan[numeric_cols] = loan[numeric_cols].apply(pd.to_numeric, errors='coerce')

# 导出时关闭正斜杠转义,关闭ASCII强制转码
results_str = loan.to_json(
    orient='records',
    force_ascii=False,
    escape_forward_slashes=False
)
# 解析为Python列表(如果直接需要JSON字符串可跳过此步)
results = json.loads(results_str)

前置校验要求

转换前先确认PySpark DataFrame的schema配置:

  • 数值类字段需定义为IntegerType/DoubleType/LongType等数值类型,不要存储为StringType,否则任何转换方式都会将其识别为字符串输出
  • 日期类字段如果是DateType/TimestampType类型,提前通过date_format()函数转为目标格式的字符串列,避免序列化时输出为时间戳格式

内容的提问来源于stack exchange,提问作者sudheer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:09:20