Azure Synapse PySpark中Spark SQL提取JSON嵌套字段报错求助
解决PySpark提取字符串类型嵌套JSON字段的问题
你的问题出在JSON路径写法错误,以下是两种可行的解决方案:
方案一:直接用get_json_object提取字段
Spark SQL中推荐使用get_json_object处理字符串类型的JSON,正确路径需按嵌套层级拆分,无需给street.name加引号。执行以下SQL即可:
select Name, Salary, Company, get_json_object(Address, '$.street.name') as StreetName from employee_data
如果坚持用你原代码里的json_extract,修正路径写法也能生效:
select Name, Salary, Company, json_extract(Address, '$.street.name') as StreetName from employee_data
方案二:先解析JSON为结构体再提取(适合多字段复用场景)
如果后续需要多次提取Address中的其他字段,建议先将string类型的Address转换为Struct类型,操作如下:
- 在PySpark中定义对应Schema:
from pyspark.sql.types import StructType, StructField, StringType address_schema = StructType([ StructField("street", StructType([ StructField("name", StringType()), StructField("number", StringType()) ])), StructField("postalcode", StringType()) ]) # 转换字段并更新临时视图 df_Employee = df_Employee.withColumn("Address_struct", from_json("Address", address_schema)) df_Employee.createOrReplaceTempView("employee_data")
- 通过SQL提取字段:
select Name, Salary, Company, Address_struct.street.name as StreetName from employee_data
错误原因说明
你原代码中$."street.name"的写法错误,street是JSON的一级键,name是street下的二级键,不能将street.name当作一个整体键名,正确路径需用.分隔层级。
内容的提问来源于stack exchange,提问作者Swasti
相关产品推荐
相关产品推荐

