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
相关产品推荐
相关产品推荐

