Polars читает базу данных AWS RDS с таблицей, содержащей столбец типа jsonb

Я пытаюсь прочитать базу данных 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.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы уверены, что кастинг на 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      │
└────────┘

Привет @Роман Пекар, когда я пытаюсь сделать такой запрос в DuckDB «выберите * из df_rds_table_test, где id=10020240501 и (json_message::json).source_transaction_name ='DEPOSIT'», он поставляется с Duckdb.duckdb.ConversionException: ошибка преобразования: неверный JSON в байте 0 ввода: неожиданный символ. Ввод: ДЕПОЗИТ. Не могли бы вы мне помочь?

Balaji Venkatachalam 22.05.2024 00:40

Нашел проблему. Он работает после CAST, т.е. «выберите * из df_rds_table_test, где id=10020240501 и CAST((json_message::json).source_transaction_name as varchar) ='DEPOSIT'»

Balaji Venkatachalam 22.05.2024 01:32

Другие вопросы по теме