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

