База данных

Использование Versatile Data Kit для получения и обработки данных из REST API

Руководство по использованию Versatile Data Kit (VDK) для получения данных из REST API, а также несколько советов по установке сервера VDK.

Versatile Data Kit (VDK) — фреймворк с открытым исходным кодом, недавно выпущенный компанией VMware. Он работает с озером данных, где вы можете получать данные разных форматов, а затем легко получать к ним доступ. В моей предыдущей статье под названием Обзор Versatile Data Kit я описал основные концепции VDK, включая пошаговое руководство по его установке. В своей следующей статье под названием От необработанных данных к очищенной базе данных: глубокий анализ универсального комплекта данных я показал, как соединить VDK и Trino DB, а также как получать и обрабатывать CSV-файлы.

В этой статье я приведу еще один пример в VDK, извлекающий данные из REST API. Поскольку для доступа к REST API требуется секретный ключ, я также описываю, как настроить сервер VDK для хранения секрета.

Статья организована следующим образом:

  • Определение сценария
  • Настройка среды
  • Загрузка данных в VDK
  • Обработка данных в ВДК

1 Определение сценария

Цель этого сценария — загрузить и обработать в VDK картины Винсента Ван Гога, доступные на Europeana, известной европейской платформе культурного наследия. Europeana предоставляет все объекты культурного наследия через свой общедоступный REST API. Europeana предоставляет более 700 работ, автором которых является Винсент Ван Гог. Для каждой записи REST API предоставляет много информации, включая полноту, страну, поставщика данных, создателя, название и многое другое.

В следующем JSON показан фрагмент записи, возвращаемый Europeana REST API:

[{
    completeness: 10,
    country: ["Belgium"],
    dataProvider: ["Catholic University of Leuven"],
    dcCreator: ["http://data.europeana.eu/agent/base/59832",
    "Vincent van Gogh"],
    dcCreatorLangAware: {
        def: ["http://data.europeana.eu/agent/base/59832"],
        en:  ["Vincent van Gogh"]
    },
    dcDescription:
        ["KU Leuven. Glasdia’s kunstgeschiedenis. Université de Louvain, tussen 1839 en 1939. Fotograaf onbekend. Toegevoegde informatie op dia. Stroming/Stijl: Postimpressionisme. Creatie/Bouw: 1889. Techniek/Materiaal: Olieverf op doek. Huidige locatie: Nederland, Otterlo, Kröller-Müller Museum. EuroPhot. Kunstgeschiedenis. 19de eeuw. Schilderkunst. Portret. EuroPhot. Art history. 19th century. Paintings. Portrait."],
        ...
}]

Точка доступа к REST API доступна по следующей ссылке:

https://api.europeana.eu/record/v2/search.json

Для получения API-ключа необходимо зарегистрироваться бесплатно.

2 Настройка среды

Для запуска этого примера мне нужно:

  • Универсальный набор данных
  • Трино БД
  • Плагин Versatile Data Kit для Trino
  • Универсальный сервер комплекта данных
  • Ключ европейского API

В моей предыдущей статье я уже описал, как настроить Trino DB и плагин Versatile Data Kit для Trino, так что вы можете обратиться к ним, если вам нужно их установить.

2.1 Универсальный сервер набора данных

В этом примере я устанавливаю сервер Versatile Data Kit (VDK) локально. Я буду использовать сервер VDK для хранения ключа Europeana API. Сервер VDK требует следующих предварительных условий:

Я могу установить их, следуя их официальному руководству. Я могу установить Versatile Data Kit Server с помощью следующей команды:

vdk server — install

Для получения дополнительной информации о том, как установить сервер VDK, вы можете обратиться к официальной документации VDK.

После завершения установки я смогу получить доступ к VDK REST API по этой ссылке:

http://localhost:8092/swagger-ui.html

Кроме того, с панели управления Docker я должен увидеть установленный сервер VDK, как показано на следующем рисунке:

Ключ европейского API 2.2

Я могу получить ключ Europeana API, зарегистрировавшись по этой ссылке. Я должен заполнить форму, которая запрашивает вашу электронную почту. Как только я отправлю форму, ключ API будет отправлен по электронной почте.

Я могу добавить ключ Europeana API в качестве свойства VDK следующим образом:

vdk properties — set-secret api_key

ВДК запросит у вас следующую информацию:

Job Name: online-exhibition
Job Team: my-team
api_key: YOUR_API_KEY

После этого шага ключ Europeana API должен храниться на вашем сервере VDK. Я могу контролировать, правильно ли он сохранен, выполнив следующую команду:

vdk properties --list

Я пишу имя работы и команду работы, и система возвращает мне ключ Europeana API.

3 Загрузка данных в VDK

Прием данных загружается в вывод базы данных при вызове Europeana REST API. Прием данных выполняется с помощью следующих шагов:

  • удалить существующую таблицу (если есть)
  • создать новую таблицу
  • получать табличные значения непосредственно из REST API.

Для доступа к Europeana REST API в этом примере требуется активное подключение к Интернету.

3.1 Удалить существующую таблицу

Я пишу этот шаг как команду SQL, которая просто удаляет таблицу, если она существует:

DROP TABLE IF EXISTS assets

Вывод REST API импортируется в таблицу с именем assets.

3.2 Создайте новую таблицу

Теперь я определяю новый шаг, который создает новую таблицу, содержащую все выходные данные REST API. Я буду импортировать вывод в виде необработанных значений, которые могут содержать JSON:

CREATE TABLE assets (
completeness int,
country varchar,
dataProvider varchar,
dcCreator varchar,
dcCreatorLangAware varchar,
dcTitleLangAware varchar,
edmDatasetName varchar,
edmIsShownBy varchar,
edmPreview varchar,
edmTimespanLabel varchar,
edmTimespanLabelLangAware varchar,
europeanaCollectionName varchar,
europeanaCompleteness int,
"guid" varchar,
id varchar,
index int,
language varchar,
link varchar,
previewNoDistribute boolean,
provider varchar,
rights varchar,
score double,
"timestamp" varchar,
timestamp_created varchar,
timestamp_created_epoch varchar,
timestamp_update varchar,
timestamp_update_epoch varchar,
title varchar,
"type" varchar,
ugc varchar
)

В следующей таблице показан пример таблицы assets:

В предыдущей таблице показаны только некоторые поля, чтобы дать представление о том, насколько сырыми являются импортированные данные.

3.3 Получение табличных значений непосредственно из REST API

Следующим шагом является скрипт Python, который импортирует значения непосредственно из REST API. Я реализую функцию run(), которая будет автоматически считываться VDK, следующим образом. Во-первых, я получаю ключ API с помощью метода get_property() файла job_input. Затем я получаю доступ к Europeana REST API. Так как Europeana возвращает информацию через разбиение на страницы, я должен просмотреть все страницы. Наконец, я сохраняю полученную информацию с помощью метода send_tabular_data_for_ingestion(). Полный код кода запуска показан ниже:

def run(job_input: IJobInput):
   api_key = job_input.get_property("key")
   start = 1
   rows = 100
 
   basic_url = f"https://api.europeana.eu/record/v2/search.json?wskey={api_key}&query=who:%22Vincent%20Van%20Gogh%22"
   url = f"{basic_url}&rows={rows}&start={start}"
   response = requests.get(url)
   response.raise_for_status()
   payload = response.json()
   n_items = int(payload["totalResults"])
   
   while start < n_items:
      if start > n_items - rows:
          rows = n_items - start + 1
          url = f"{basic_url}&rows={rows}&start={start}"
          response = requests.get(url)
          response.raise_for_status()
          payload = response.json()["items"]
          df = pd.DataFrame(payload)
          job_input.send_tabular_data_for_ingestion(
             df.itertuples(index=False),
             destination_table="assets",
             column_names=df.columns.tolist(),
          )
          start = start + rows

4 Обработка данных

Импортированная таблица довольно грязная, поэтому ее следует почистить. Обработка данных включает в себя очистку таблицы активов и извлечение только некоторой полезной информации. Извлеченная информация включает следующие столбцы:

  • страна
  • edmПредварительный просмотр
  • провайдер
  • заголовок
  • права

Я сохраняю полученную таблицу в таблице с именем clean_assets. Я определяю два этапа обработки данных:

  • удалите cleaned_assets table (если есть)
  • создайте и заполните файл cleaned_assets table.

4.1 Удалить таблицу clean_assets

Как и в случае с таблицей активов, этот шаг представляет собой один оператор SQL, который удаляет таблицу, если она существует:

DROP TABLE IF EXISTS cleaned_assets

4.2 Создайте и заполните таблицу clean_assets

Этот шаг манипулирует таблицей активов, чтобы извлечь только полезную информацию. Я могу написать это следующим образом:

CREATE TABLE cleaned_assets AS (
SELECT
  SUBSTRING(country, 3, LENGTH(country)-4) AS country,
  SUBSTRING(edmPreview, 3, LENGTH(edmPreview)-4) AS edmPreview,
  SUBSTRING(provider, 3, LENGTH(provider)-4) AS provider,
  SUBSTRING(title, 3, LENGTH(title)-4) AS title,
  SUBSTRING(rights, 3, LENGTH(rights)-4) AS rights
FROM assets
)

Предыдущий код очищает некоторые поля через функцию SUBSTRING().

Теперь набор данных готов для дальнейшего анализа! Наслаждайся этим!

Краткое содержание

Поздравляем! Вы только что узнали, как импортировать данные из REST API в VDK, а также как настроить сервер VDK для хранения секретов. Пример, описанный в этой статье, вы можете скачать из официального репозитория ВДК, в разделе примеры → онлайн-выставка.

На данный момент - все. Следите за дальнейшими обновлениями на VDK!

Статьи по Теме