Как сгладить/отменить вложение/нормализовать вложенный столбец JSON в DuckDB (т. е. разделить вложенные поля на отдельныPython

Программы на Python
Ответить
Anonymous
 Как сгладить/отменить вложение/нормализовать вложенный столбец JSON в DuckDB (т. е. разделить вложенные поля на отдельны

Сообщение Anonymous »

Типы столбцов:

Код: Выделить всё

D describe some_table;
┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │  null   │   key   │ default │  extra  │
│   varchar   │   varchar   │ varchar │ varchar │ varchar │ varchar │
├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ id          │ BIGINT      │ YES     │         │         │         │
│ data        │ JSON        │ YES     │         │         │         │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘
Пример данных:

Код: Выделить всё

D select id, data from some_table;
┌────────┬──────────────────────────────────────────────────────────────────────────────────┐
│   id   │                                    data                                          │
│ int64  │                                    json                                          │
├────────┼──────────────────────────────────────────────────────────────────────────────────┤
│      1 │ {"type":"abc","purpose":"ad","ts":"...","userId":"","context":{"ip":"x.x.x.x",...│
│      2 │ {"type":"abc","purpose":"search","ts":"...","userId":"ABCD1234","context":{"ip...│
│      3 │ {"type":"defghi","purpose":null,"ts":"...","userId":"","context":{"ip":"x.x.x....│
...
└───────────────────────────────────────────────────────────────────────────────────────────┘
Ожидание:

Код: Выделить всё

┌──────────┬─────────┬─────┬──────────┬─────────────┬──────────────────┐
│ type     │ purpose │ ts  │ userId   │ context.ip  │ context.sth.else │
├──────────┼─────────┼─────┼──────────┼─────────────┼──────────────────┤
│ abc      │ ad      │ ... │          │             │                  │
│ abc      │ search  │ ... │          │             │                  │
│ defghi   │ null    │ ... │ ABCD1234 │             │                  │
└──────────┴─────────┴─────┴──────────┴─────────────┴──────────────────┘
Я пробовал использовать unnest, но он работает только со структурами/списками:

Код: Выделить всё

D select unnest(data) from some_table limit 5;
Error: Binder Error: UNNEST() can only be applied to lists, structs and NULL
LINE 1: select unnest(data) from some_table limit 5;
^
Итак, я попробовал unnest с помощью from_json на основе Unnest JSON Array в строки (pseudo-json_each), но это тоже не сработало:

Код: Выделить всё

D select unnest(from_json(data, '"JSON"')) from some_table limit 5;
Error: Binder Error: UNNEST() can only be applied to lists, structs and NULL
LINE 1: select unnest(from_json(data, '"JSON"')) from ...
^
Я пытался найти это решение и наткнулся на следующее: Но все они, похоже, предполагают, что данные хранятся в файлах JSON, тогда как Я прочитал эту таблицу из файла CSV. Я хочу сгладить существующий столбец JSON.
В качестве альтернативы, если бы я мог преобразовать этот столбец JSON в столбец STRUCT, это позволило бы мне использовать функцию unnest. Но мне также не удалось найти никаких ссылок на этот вопрос в Интернете.
TL;DR – я ищу эквивалент pandas.json_normalize в DuckDB.

Подробнее здесь: https://stackoverflow.com/questions/781 ... e-split-ne
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»