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

PySpark转Pandas时,JSON数组列转字典列表的高效方法

解决方案

最优方案:Spark端直接保留数组类型

问题根源在于你用F.to_json把Spark中的数组转成了JSON字符串,转Pandas后自然会是字符串类型。最高效的方式是跳过JSON序列化步骤,直接在Spark中保留数组类型,转Pandas时会自动转为Python列表:

import pyspark.sql.functions as F
import pandas as pd

my_df = (
    spark
    .createDataFrame(
        pd.DataFrame([['Scott', 50], ['Jeff', 45], ['Thomas', 54], ['Ann',34]], columns=['id', 'score'])
    )
)

# 直接聚合为排序后的数组,不转JSON
pandas_df = (
    my_df
    .groupBy('id')
    .agg(
        F.sort_array(
            F.collect_list(F.col('score')), asc=False
        ).alias('preds')
    )
    .toPandas()
)

此时pandas_df['preds']直接是Python列表类型,无需后续转换,完全避免了JSON序列化/反序列化的性能开销。

若必须保留JSON字符串:用安全高效的JSON解析替代eval

如果业务逻辑要求Spark输出JSON字符串(比如中间存储需要),不要用eval(存在安全风险且效率低),改用专门的JSON解析工具:

方法1:使用json.loads(通用兼容)

import json

# 替换eval,安全解析JSON字符串
pandas_df['preds'] = pandas_df['preds'].apply(json.loads)

方法2:使用Pandas矢量化方法(更高性能)

Pandas 1.3.0及以上版本支持str.json_loads,这是矢量化操作,比逐行apply效率更高:

# 矢量化解析JSON字符串
pandas_df['preds'] = pandas_df['preds'].str.json_loads()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:55:22