PySpark中如何将JSON数组列转换为字典列表
问题原因
列变成字符串的核心原因是你在聚合逻辑里用了F.to_json(),这个函数的作用就是把Spark的结构化类型(数组、结构体等)序列化成JSON字符串,转Pandas之后自然是字符串类型,和Pandas侧的处理没有关系。
PySpark侧直接生成字典列表列的方法
直接把外层包裹的F.to_json()删掉就行。Spark里ArrayType(StructType)类型的字段,在调用toPandas()的时候会自动映射成Pandas里「字典组成的列表」的原生Python类型,不需要额外做序列化、反序列化操作。
修正后的代码:
import pyspark.sql.functions as F pd_df = ( df .withColumn('city_list', F.struct(F.col('n_res'), F.col('city'))) .groupBy(['user_ip', 'created_month']) .agg( F.sort_array( F.collect_list(F.col('city_list')), asc=False ).alias('city_list') ) ).toPandas()
执行完直接查看pd_df['city_list'],每个单元格的值就是你要的字典列表,不需要再做任何转换。
兜底安全转换方案
如果你的业务逻辑必须保留F.to_json()步骤,绝对不要用eval做转换,用Python标准库json.loads即可,没有任意代码执行的安全风险:
import json pd_df['city_list'] = pd_df['city_list'].apply(json.loads)
注意:你贴的示例值里
city字段是00005这类带前导零的内容,标准JSON不支持数字带前导零,说明你贴的示例是Python字典的字符串表现,不是合法JSON,这种场景优先用上面删掉to_json的方案,避免JSON解析报错。
内容的提问来源于stack exchange,提问作者3nomis
相关产品推荐
相关产品推荐

