- PVSM.RU - https://www.pvsm.ru -
Как эффективно работать с json в R?
Является продолжением предыдущих публикаций [1].
Как правило, основным источником данных в формате json оказыватся REST API. Применение json помимо платформонезависимости и удобства восприятия данных человеком позволяет обмениваться системам неструктурированными данными со сложной древовидной структурой.
В задачах построения API это очень удобно. Легко обеспечить версионность коммуникационных протоколов, легко обеспечить гибкость информационного обмена. При этом сложность структуры данных (уровней вложенности может быть 5, 6, 10 или даже больше) не пугает, поскольку написать для единичной записи гибкий парсер, учитывающий все и вся, не так уж сложно.
Задачи обработки данных включают в себя также получение данных из внешних источников, в т.ч. в формате json. В R есть хороший набор пакетов, в частности, jsonlite, предназначенных для преобразования json в объекты R (list или, data.frame, если структура данных позволяет).
Однако, на практике часто возникает два класса задач, когда использование jsonlite и ему подобных становится крайне неэффективным. Задачи выглядят примерно так:
data.frame).Пример подобной структуры на иллюстрациях:


Почему же эти классы задач проблематичны?
Как правило, выгрузки из информационных систем в формате json представляют собой неделимый блок данных. Чтобы его распарсить корректно необходимо весь его прочитать и пробежаться по всему его объему.
Индуцированные проблемы:
data.frame. Подобные задачи возникают, например, когда необходимо по пачке запросов через API собрать справочники, требуемые по бизнес-процессу для работы. Дополнительно справочники подразумевают унификацию и готовность к встраиванию в аналитический пайплайн и потенциальной выгрузке в БД. А это опять же приводит к необходимости превращения таких сводных данных в data.frame.
Индуцированные проблемы:
NULL объектов, которые уместны в списках, но не могут "уместиться" в data.frame, что еще больше усложняет постпроцессинг и усложняет даже базовый процесс слияния отдельных строк-листов в data.frame (неважно, rbindlist, bind_rows, "map_dfr' или rbind).JQ — выход из ситуации
В особо сложных ситуациях применение весьма подходов пакета jsonlite "конвертируем все в R объекты" по указанным выше причинам дает серьезный сбой. Хорошо, если до конца обработки удаётся добраться. Хуже, если посередине придется развести руки и сдаться.
Альтернативой такому подходу является использование json препроцессора, оперирующего непосредственно данными в формате json. Библиотека jq [2] и обертка jqr [3]. Практика показывает, что ее не только мало используют, но и мало кто о ней вообще слышал и очень зря.
Преимущества библиотеки jq.
data.frame средствами jsonlite;Код по обработке сжимается до размеров экрана и может выглядеть примерно таким образом:
cont <- httr::content(r3, as = "text", encoding = "UTF-8")
m <- cont %>%
# исключим ненужные атрибутивные списки
jqr::jq('del(.[].movie.rating, .[].movie.genres, .[].movie.trailers)') %>%
jqr::jq('del(.[].movie.countries, .[].movie.images)') %>%
# исключим ненужные атрибутивные списки
jqr::jq('del(.[].schedules[].hall, .[].schedules[].language, .[].schedules[].subtitle)') %>%
# исключим ненужные атрибутивные списки
jqr::jq('del(.[].cinema.location, .[].cinema.photo, .[].cinema.phones)') %>%
jqr::jq('del(.[].cinema.goodies, .[].cinema.subway_stations)')
# расщепляем
m2 <- m %>%
jqr::jq('[.[] | {date, movie, schedule: .schedules[], cinema}]')
df <- fromJSON(m2) %>%
as_tibble()
jq весьма элегантен и быстр! Тем, кому это актуально: качаем, ставим, разбираемся. Ускоряем процессинг, упрощаем жизнь себе и коллегам.
Предыдущая публикация — «Как начать применять R в Enterprise. Пример практического подхода» [4].
Автор: i_shutov
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/data-mining/315369
Ссылки в тексте:
[1] предыдущих публикаций: https://habrahabr.ru/users/i_shutov/posts/
[2] jq: https://stedolan.github.io/jq/
[3] jqr: https://github.com/ropensci/jqr
[4] «Как начать применять R в Enterprise. Пример практического подхода»: https://habr.com/ru/post/448946/
[5] Источник: https://habr.com/ru/post/448950/?utm_campaign=448950
Нажмите здесь для печати.