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

PySpark中select()可解析JSON,selectExpr()调用get_json_object报错

解决Spark中selectExpr()使用get_json_object报错TypeError的问题

我明白你遇到的困扰了——用select()调用get_json_object能正常解析JSON数组,但换成selectExpr()就抛出TypeError: Column is not iterable错误。这核心原因是你没搞清楚select()和selectExpr()的参数要求差异。

问题根源

  • select()方法支持直接传入Column对象:get_json_object(col(...), ...)返回的就是Column类型,所以用select()可以直接处理,不会报错。
  • selectExpr()方法只接受SQL风格的字符串表达式:它会把你传入的内容当作SQL语句来解析,而不是直接处理Column对象。当你把get_json_object生成的Column对象传给它时,Spark会尝试迭代这个Column,自然就触发了Column is not iterable的错误。

修正方案

方案1:用SQL字符串形式调用selectExpr()

把get_json_object的调用写成SQL字符串,直接传给selectExpr():

from pyspark.sql import SparkSession
from pyspark.sql.functions import *

spark = SparkSession.builder.appName("JsonPractice").getOrCreate()
my_json_df = spark.range(1).selectExpr(
    ''''{"sample_json":{"sample_json1":["1st_vale","2nd_val"]}}' as my_json_column'''
)

# 解析数组中第二个元素
my_json_df.selectExpr("get_json_object(my_json_column, '$.sample_json.sample_json1[1]')").show(2)

# 解析整个数组
my_json_df.selectExpr("get_json_object(my_json_column, '$.sample_json.sample_json1')").show()

方案2:保留Column对象,改用select()方法

如果你更习惯用Spark函数构建Column对象,那就保持这个写法,换成select()方法即可:

from pyspark.sql import SparkSession
from pyspark.sql.functions import *

spark = SparkSession.builder.appName("JsonPractice").getOrCreate()
my_json_df = spark.range(1).selectExpr(
    ''''{"sample_json":{"sample_json1":["1st_vale","2nd_val"]}}' as my_json_column'''
)

# 解析数组中第二个元素
my_json_df.select(get_json_object(col("my_json_column"), "$.sample_json.sample_json1[1]")).show(2)

# 解析整个数组
my_select_expr = get_json_object(col('my_json_column'), '$.sample_json.sample_json1')
my_json_df.select(my_select_expr).show()

小提示

selectExpr()本质是select(expr("..."))的语法糖,适合快速编写复杂的SQL风格表达式;而select()更适合用Spark内置函数来构建Column逻辑的场景,二者可以根据你的需求灵活选择。

内容的提问来源于stack exchange,提问作者noobie-php

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:22:43