使用PySpark从DataFrame构建嵌套JSON时子列转为字符串的问题
解决PySpark嵌套JSON被转为字符串的问题
你的问题出在对嵌套的struct额外调用了to_json——这个操作会把内部结构先序列化成字符串,外层再转JSON时自然就变成带引号的转义字符串。正确做法是直接用struct构建嵌套层级,最后统一在外层用to_json处理整个结构。
正确代码实现
from pyspark.sql.functions import * # 示例数据 df = spark.createDataFrame( [('1234567','123 Main St','10SjtT','idk@gmail.com','ecom','direct')], ['cust_id','address','store_id','email','sales_channel','category'] ) # 构建嵌套结构,仅在外层使用to_json dff = df.select( "cust_id", "address", to_json( struct( "store_id", "category", "sales_channel", "email", # 直接用struct创建嵌套对象,无需调用to_json struct("category", "email").alias("c_email") ) ).alias("metadata") ) # 查看结果 dff.select("metadata").show(10, False)
输出验证
执行后metadata列的JSON会符合你的期望格式:
{ "store_id": "10SjtT", "category": "direct", "sales_channel": "ecom", "email": "idk@gmail.com", "c_email": { "category": "direct", "email": "idk@gmail.com" } }
错误原因说明
你原代码中对内部的struct("category", "email")调用了to_json,这一步会把该结构转成字符串"{\"category\":\"direct\",\"email\":\"idk@gmail.com\"}"。当外层再用to_json处理时,这个字符串会被当成普通字符串值,最终输出里c_email就变成了带引号的转义字符串,而非JSON对象。
内容的提问来源于stack exchange,提问作者Manoj
相关产品推荐
相关产品推荐

