使用pd.read_sql读取SQL数据时如何直接解析JSON字段拆分为多列
完全可以实现,更推荐优先在SQL查询阶段完成JSON解析,比读取到Python后再处理性能更高,也符合计算下沉的优化原则。
方法1:SQL端直接解析(最优方案)
MSSQL 2016及更高版本内置了JSON处理函数,你可以直接在查询语句中提取JSON字段的属性,读出来就是你需要的3列DataFrame,无需额外Python侧处理:
import urllib import sqlalchemy as sa import pandas as pd params = urllib.parse.quote_plus("bla") engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params)) with engine.connect() as con: sql_df = pd.read_sql( """ SELECT TOP 10 JSON_VALUE(json_column, '$.c1') AS c1, JSON_VALUE(json_column, '$.c2') AS c2, id FROM SomeTable; """, con=con )
如果JSON字段内需要提取的属性很多,可以改用OPENJSON语法批量解析,写法更简洁。
方法2:Python端读取后同步解析
如果你没有权限修改查询SQL,也可以读取后用pandas内置的JSON解析工具处理:
import urllib import json import sqlalchemy as sa import pandas as pd params = urllib.parse.quote_plus("bla") engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params)) with engine.connect() as con: sql_df = pd.read_sql( "SELECT TOP 10 json_column, id FROM SomeTable;", con=con ) # 解析JSON字段并合并 json_parsed = pd.json_normalize(sql_df['json_column'].apply(json.loads)) final_df = pd.concat([sql_df['id'], json_parsed], axis=1)
原代码优化提示:你原代码中
pd.read_sql的con参数误传了engine,实际已经通过上下文管理器创建了连接对象con,直接传con=con即可,避免重复创建连接,提升稳定性。
内容的提问来源于stack exchange,提问作者cs0815
相关产品推荐
相关产品推荐

