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

PySpark引用JSON的name字段返回TypeError报错如何解决

问题根因

这个报错和name是保留字无关,本质是PySpark的Column类本身内置了名为name的实例方法。当你用.属性访问的方式读取嵌套字段时,只要字段名和Column内置属性/方法重名,Python会优先返回内置的方法对象,而不是你要的嵌套字段列——你之前能正常读取externalCode,就是因为Column没有同名内置成员,属性访问能正确命中嵌套字段,碰到name时直接拿到了内置方法,才触发如下类型错误:

TypeError: Invalid argument, not a string or column: <bound method
alias of Column<'d'>> of type <class 'method'>. For column literals,
use 'lit', 'array', 'struct' or 'create_map' function.

你之前尝试的jsonDF2.d.'name'本身不符合Python语法,直接传入字符串'name'则只会匹配DataFrame顶层的name列,不会读取d结构体下的嵌套name字段,所以都会失败。

可行解决方案

以下三种写法都可以规避属性访问的重名冲突,按需选择即可:

  • 方案1:使用col()函数显式声明嵌套字段路径(最推荐,兼容性最好,完全不受重名影响)
from pyspark.sql.functions import explode, col

jsonDF2 = jsonDF.withColumn('d', explode(col('d.results')))
jsonDF2 = jsonDF2.select(
    col("d.externalCode").alias("CompanyCode"),
    col("d.name")
)
  • 方案2:用方括号索引语法访问嵌套字段,绕开属性名匹配逻辑
from pyspark.sql.functions import explode, col

jsonDF2 = jsonDF.withColumn('d', explode(col('d.results')))
jsonDF2 = jsonDF2.select(
    jsonDF2.d.externalCode.alias("CompanyCode"),
    jsonDF2.d["name"]
)
  • 方案3:使用SQL风格的selectExpr直接写字段路径
from pyspark.sql.functions import explode, col

jsonDF2 = jsonDF.withColumn('d', explode(col('d.results')))
jsonDF2 = jsonDF2.selectExpr(
    "d.externalCode as CompanyCode",
    "d.name"
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:01:29