LINUX.ORG.RU

Положить JSON Lines в RDBMS

 , , , ,


0

2

Нужно импортировать большой набор данных в виде файлов содержащих JSON Lines в реляционную базу. Каждая строчка в файле - документ какого-то типа. Какого типа - прописывается в определенном поле.

Не буду говорить что база это PostgreSQL - JSON поля не предлагать :-). MongoDB / ElasticSearch / etc тоже не предлагать. EAV тоже не предлагать.

Для каждого типа документов должна быть отдельная таблица, отображающая структуру документа.

Как бы вы решали такую задачу?

★★★★★

Ответ на: комментарий от FIL

Этот скрипт должен определить структуру каждого типа документов, создать эту структуру в БД и сложить туда документы. Звучит геморойно... Хочется уменьшить количество боли, сохранив при этом возможность выполнять полноценные SQL запросы над этими данными.

ei-grad ★★★★★ ()
Последнее исправление: ei-grad (всего исправлений: 1)

структура в xml, данные в json, валидация в $your_selected_programming_language_with_xml_parsing_libs.
гибко и удобно, если что не так можно перелопатить, плюс варианты для других структур продумать.

etwrq ★★★★ ()
Последнее исправление: etwrq (всего исправлений: 1)
Ответ на: комментарий от ei-grad

Этот скрипт должен определить структуру каждого типа документов, создать эту структуру в БД и сложить туда документы. Звучит геморойно... Хочется уменьшить количество боли, сохранив при этом возможность выполнять полноценные SQL запросы над этими данными.

а что там за документы, уровень вложенности лютый какой-нибудь?

Novel ★★★★ ()

а kdb+ можно предлагать? оно вполне реляционное и само способно такое загрузить (и любое другое):

$ cat file.jsonl
{"type":"parts","name":"nook","weight":0.1}
{"type":"suppliers","name":"acme"}
{"type":"parts","name":"cranny","weight":10}
{"type":"suppliers","name":"contoso"}
$ cat load.q
j:.j.k each read0 `:file.jsonl
{(`$key x)set'j value x}group j[;`type]
$ q load.q
`parts`suppliers
q)select from parts
type    name     weight
-----------------------
"parts" "nook"   0.1
"parts" "cranny" 10
q)select from suppliers
type        name
---------------------
"suppliers" "acme"
"suppliers" "contoso"
anonymous ()
Ответ на: комментарий от ei-grad

Звучит геморойно

Не пойму, а в чём геморрой? Пишешь базовый класс entity и на каждый тип документа свой подкласс, структуру можно описывать по-разному, например аннотациями, или зашивать в метод (например getSchema), а там уже можно хоть массивом описывать, хоть из xml или yaml подтягивать. Паттерн «шаблонный метод» во все поля.

no-such-file ★★★★★ ()
Ответ на: комментарий от anonymous

Шикардос прям, жалко что проприетарщина, но можно подумать)

ei-grad ★★★★★ ()
Ответ на: комментарий от Novel

Обычные JSON'ки с метриками и описаниями событий. Уровень вложенности - 1-2. Можно в join через точку развернуть.

ei-grad ★★★★★ ()
Ответ на: комментарий от etwrq

Вы батенька знаете толк в извращениях). Зачем XML?))) В чем гибкость?) Где тут удобство?)))

ei-grad ★★★★★ ()
Ответ на: комментарий от no-such-file

Структуру не хочется описывать, хочется чтобы автоматом строилась какая-то базовая. Но чуть более нативная для SQL чем все поля в одном JSON-столбце.

ei-grad ★★★★★ ()
Последнее исправление: ei-grad (всего исправлений: 1)

Суть вопроса слишком неопределенна. Покажи пример строки и что хочешь получить в итоге в таблице.

anonymous ()
Ответ на: комментарий от ei-grad

Этот скрипт должен определить структуру каждого типа документов, создать эту структуру в БД и сложить туда документы. Звучит геморойно...

Используй JavaScript. Спроси у anonimous'а как.

korvin_ ★★★★★ ()
Ответ на: комментарий от korvin_

Кстати, и правда каким-нибудь waterline'ом должно быть не сложно... Спасибо! // Правда один фиг я наверно всё-таки свой велосипед под sqlalchemy допилю... :-(

ei-grad ★★★★★ ()
Ответ на: комментарий от ei-grad

чуть более нативная для SQL

Что ты имеешь ввиду? В postgres можно индексы строить сейчас по json колонкам и запросы по ним делать.

pawnhearts ★★★★★ ()
Ответ на: комментарий от ei-grad

Но чуть более нативная для SQL чем все поля в одном JSON-столбце

Ну клади тогда каждое поле в varchar или text.

no-such-file ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.