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

