Polars读取RDS jsonb列后DuckDB无法解析字段求助
解决DuckDB访问Polars中JSON字符串字段的问题
问题背景
通过Polars的pl.read_database_uri读取AWS RDS PostgreSQL表时,表中的jsonb类型列json_message被识别为String类型。后续用DuckDB执行SQL提取JSON字段时,抛出BinderException,提示无法从非struct/union/json类型提取字段,此前尝试转struct、DuckDB内转JSON均未解决。
可行解决方案
方案1:DuckDB内显式解析JSON字符串
直接在DuckDB查询中把字符串转为JSON类型后提取字段,语法如下:
- 基础提取(返回JSON类型):
SELECT id, (json_message::json)->'amount' AS amount FROM df_rds_table_test WHERE id = 10020240501;
- 提取并转换为数值类型:
SELECT id, CAST((json_message::json)->'amount' AS INTEGER) AS amount FROM df_rds_table_test WHERE id = 10020240501;
- 使用
json_extract_string函数提取字符串类型值:
SELECT id, json_extract_string(json_message, '$.amount') AS amount FROM df_rds_table_test WHERE id = 10020240501;
方案2:Polars读取后转换为JSON类型
在Polars中将String类型的json_message转为Polars原生JSON类型,DuckDB可直接识别并提取字段:
import polars as pl import duckdb # 读取RDS表 df_rds_table_test = pl.read_database_uri( uri="your_postgres_connection_uri", query="SELECT id, json_message FROM your_table_name" ) # 将字符串列解析为Polars JSON类型 df_rds_table_test = df_rds_table_test.with_columns( pl.col("json_message").str.json_parse().alias("json_message") ) # 注册到DuckDB并查询 con = duckdb.connect() con.register("df_rds_table_test", df_rds_table_test) result = con.execute(""" SELECT id, json_message.amount AS amount FROM df_rds_table_test WHERE id = 10020240501 """).df()
方案3:PostgreSQL查询阶段提前解析JSON
在读取数据的SQL中直接让PostgreSQL解析jsonb字段,Polars拿到的是普通字段,无需后续处理:
df_rds_table_test = pl.read_database_uri( uri="your_postgres_connection_uri", query=""" SELECT id, json_message->>'amount' AS amount, json_message->>'c_id' AS c_id, json_message->>'branch' AS branch FROM your_table_name """ ) # 直接用DuckDB查询普通字段即可 con = duckdb.connect() con.register("df_rds_table_test", df_rds_table_test) result = con.execute("SELECT id, amount FROM df_rds_table_test WHERE id = 10020240501").df()
此前尝试无效的可能原因
- 转struct失败:若JSON存在null值或字段类型不固定,Polars的struct解析会报错,转为JSON类型更适配灵活结构。
- DuckDB内转换无效:可能是转换语法错误,需确保用
::json或json()函数完成字符串到JSON类型的显式转换。
内容的提问来源于stack exchange,提问作者Balaji Venkatachalam
相关产品推荐
相关产品推荐

