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

如何在PySpark SQL中将字符串类型genres列转换为字典列表?

解决PySpark中字符串列转字典列表的问题

你遇到的核心问题是:不能直接在PySpark的分布式列对象上使用Python原生的eval或astype函数——这些函数是本地Python函数,无法直接作用于Spark分布式数据集的列,得用Spark提供的API或者自定义UDF来处理。下面给你两种可行的解决方案:

方法1:使用Spark内置from_json函数(推荐,性能更优)

你的genres列本质是JSON格式的字符串,Spark内置了专门的JSON解析函数from_json,不需要依赖Python的eval,而且性能比UDF高很多。

步骤:

  1. 先定义genres列对应的JSON Schema(对应你要解析的字典列表结构);
  2. 用from_json将字符串列解析成Spark的数组结构体类型。
from pyspark.sql import functions as F
from pyspark.sql.types import StructType, StructField, IntegerType, StringType, ArrayType

# 定义genres列的JSON Schema:数组包含多个{id:整数, name:字符串}的结构体
genre_schema = ArrayType(
    StructType([
        StructField("id", IntegerType(), nullable=True),
        StructField("name", StringType(), nullable=True)
    ])
)

# 解析genres列,生成新的结构化列
bmd2_parsed = bmd2.withColumn(
    "genres_parsed", 
    F.from_json(F.col("genres"), genre_schema)
)

# 查看解析结果
bmd2_parsed.select("genres", "genres_parsed").show(truncate=False)

解析后的genres_parsed列可以直接用Spark的数组/结构体操作访问元素,比如F.col("genres_parsed")[0]["name"]就能取第一个分类的名称。

方法2:使用自定义UDF(仅数据可信时使用)

如果你一定要用Python的eval,可以把它包装成Spark的UDF,但要注意:eval存在安全风险,如果genres列包含恶意代码,会直接在本地执行,所以只在数据完全可信的场景下使用。

from pyspark.sql import functions as F
from pyspark.sql.types import ArrayType, StructType, StructField, IntegerType, StringType

# 复用方法1定义的genre_schema
genre_schema = ArrayType(
    StructType([
        StructField("id", IntegerType(), nullable=True),
        StructField("name", StringType(), nullable=True)
    ])
)

# 包装eval为UDF
eval_genres_udf = F.udf(lambda x: eval(x), genre_schema)

# 应用UDF解析列
bmd2_parsed = bmd2.withColumn("genres_parsed", eval_genres_udf(F.col("genres")))

顺便解释下你之前的错误:

  • 错误1:'genres'.astype('list'):你是把字符串'genres'当成了Python变量,而非Spark的列对象;另外Spark中没有astype方法,就算用cast也只能转换基本数据类型,无法解析复杂的JSON结构。
  • 错误2/3:eval('genres'):这里的eval是在本地Python环境执行的,它会寻找本地变量genres,而非DataFrame中的列,所以会报NameError——必须用UDF把eval包装成能作用于分布式列的函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:12