Я пытаюсь прочитать базу данных AWS RDS, используя следующий метод через поляры:
df_rds_table_test = pl.read_database_uri(sql_query, uri)
БД Postgres содержит таблицу с именем столбца «json_message» типа jsonb и другими столбцами типа String. Когда таблица читается полярами, она обрабатывает тип данных столбца json_message как String.
Кроме того, я использую DuckDB в фрейме данных Polars для выполнения операций SQL.
SQL_QUERY_SRC_JOIN = "select id,json_message.amount as amount from df_rds_table_test where id=10020240501"
src_df = duckdb.sql(SQL_QUERY_SRC_JOIN).pl()
Я получаю исключение, в котором говорится
duckdb.duckdb.BinderException: Binder Error: Cannot extract field 'amount' from expression "json_message" because it is not a struct, union, or json
Не уверен, что есть способ привести тип данных к jsonb в полярах, поскольку он не поддерживается. Я попытался привести json_message к структуре, но получаю ошибку.
Также я попробовал использовать json_message для ввода JSON в запросе DuckDB, что тоже не помогло.
Пример json_message:
{
"amount": 0,
"c_id": null,
"branch": "0502",
"user_id": "U999999"}
Отлично, если бы кто-нибудь мог помочь мне получить доступ к строке json в фрейме данных Polars с помощью DuckDB.
Вы уверены, что кастинг на json
не работает? Это работает в этом примере:
tbl = duckdb.sql("""
from (values
('{"amount": 0,"c_id": null, "branch": "0502", "user_id": "U999999"}')
)
select col0 as json_message
""")
┌────────────────────────────────────────────────────────────────────┐
│ json_message │
│ varchar │
├────────────────────────────────────────────────────────────────────┤
│ {"amount": 0,"c_id": null, "branch": "0502", "user_id": "U999999"} │
└────────────────────────────────────────────────────────────────────┘
duckdb.sql("""
select (json_message::json).amount as amount from tbl
""")
┌────────┐
│ amount │
│ json │
├────────┤
│ 0 │
└────────┘
или с polars
:
df = tbl.pl()
(
df
.with_columns(pl.col("json_message").str.json_decode())
.select(pl.col("json_message").struct.field("amount"))
)
┌────────┐
│ amount │
│ --- │
│ i64 │
╞════════╡
│ 0 │
└────────┘
Нашел проблему. Он работает после CAST, т.е. «выберите * из df_rds_table_test, где id=10020240501 и CAST((json_message::json).source_transaction_name as varchar) ='DEPOSIT'»
Привет @Роман Пекар, когда я пытаюсь сделать такой запрос в DuckDB «выберите * из df_rds_table_test, где id=10020240501 и (json_message::json).source_transaction_name ='DEPOSIT'», он поставляется с Duckdb.duckdb.ConversionException: ошибка преобразования: неверный JSON в байте 0 ввода: неожиданный символ. Ввод: ДЕПОЗИТ. Не могли бы вы мне помочь?