You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:12:37