Модели полуструктурированных данных
В этой статье рекомендуется хранить полуструктурированные данные в зависимости от того, как ваша организация использует данные. Azure Databricks предоставляет функции, собственные типы данных и синтаксис запросов для работы с полуструктурированных, вложенными и сложными данными.
Следующие рекомендации влияют на то, какой шаблон следует использовать:
- Часто ли изменяются поля или типы в источнике данных?
- Сколько уникальных полей содержится в источнике данных?
- Нужно ли оптимизировать рабочие нагрузки для операций записи или чтения?
Databricks рекомендует хранить данные в виде таблиц Delta для подчиненных запросов.
Использование варианта
В Databricks Runtime 15.3 и более поздних версиях можно использовать VARIANT
тип для хранения полуструктурированных данных JSON с помощью оптимизированной кодировки, которая превышает строки JSON для операций чтения и записи.
Тип VARIANT
имеет аналогичные приложения, как строки JSON. Некоторые рабочие нагрузки по-прежнему используют структуры, карты и массивы, особенно для данных с хорошо известными схемами, которые могут воспользоваться оптимизированным макетом данных и сбором статистики.
Дополнительные сведения см. в следующих статьях:
- Запрос данных варианта
- Как отличается от строк JSON?
- Прием данных в виде полуструктурированного типа варианта
Использование строк JSON
Данные можно хранить в одном строковом столбце с помощью стандартного форматирования JSON, а затем запрашивать поля в формате JSON с помощью :
нотации.
Многие системы выходные записи в виде строковых или байтовых записей JSON. Прием и хранение этих записей в виде строк имеет очень низкую нагрузку на обработку. Вы также можете использовать функцию to_json
, чтобы превратить любую структуру данных в строку JSON.
При выборе хранения данных в виде строк JSON следует учитывать следующие сильные стороны и недостатки:
- Все значения хранятся в виде строк без сведений о типе.
- JSON поддерживает все типы данных, которые можно представить с помощью текста.
- JSON поддерживает строки произвольной длины.
- Нет ограничений на количество полей, которые можно представить в одном столбце данных JSON.
- Данные не требуют предварительной обработки перед записью в таблицу.
- Вы можете устранить проблемы типа, присутствующих в данных в подчиненных рабочих нагрузках.
- JSON обеспечивает наихудшую производительность при чтении, так как необходимо проанализировать всю строку для каждого запроса.
Строки JSON обеспечивают большую гибкость и простое решение для получения необработанных данных в таблицу Lakehouse. Вы можете использовать строки JSON для многих приложений, но они особенно полезны, если наиболее важный результат рабочей нагрузки сохраняет полное и точное представление источника данных для последующей обработки. Некоторые варианты использования могут включать:
- Прием потоковых данных из службы очередей, например Kafka.
- Запись запросов REST API ответов.
- Хранение необработанных записей из вышестоящего источника данных, не контролируемого командой.
Предполагая, что логика приема является гибкой, хранение данных в виде строки JSON должно быть устойчивым, даже если вы столкнулись с новыми полями, изменениями структуры данных или типом изменений в источнике данных. Хотя подчиненные рабочие нагрузки могут завершиться ошибкой из-за этих изменений, таблица содержит полную историю исходных данных, что означает, что вы можете устранить проблемы без необходимости вернуться к источнику данных.
Использование структур
Вы можете хранить полуструктурированные данные с структурами и включить все собственные функциональные возможности столбцов при сохранении вложенной структуры источника данных.
Delta Lake обрабатывает данные, хранящиеся как структуры, так же, как и любые другие столбцы, то есть нет функциональной разницы от структур и столбцов. Файлы данных Parquet, используемые Delta Lake, создают столбец для каждого поля в структуре. Поля структуры можно использовать в качестве кластеризации столбцов или столбцов секционирования, и вы можете собирать статистику по структуры для пропуска данных.
Структуры обычно обеспечивают лучшую производительность при чтении, так как они поддерживают оптимизацию всех данных и хранят отдельные поля в виде столбцов. Производительность может начать страдать, когда количество столбцов, присутствующих в сотнях.
Каждое поле в структуре имеет тип данных, который применяется для записи так же, как столбцы. Таким образом, структуры требуют полной предварительной обработки данных. Это может быть полезно, если требуется только проверенные данные, зафиксированные в таблице, но могут привести к удалению данных или сбою заданий при обработке неправильно сформированных записей из вышестоящих систем.
Структуры менее гибки, чем потоки JSON для эволюции схемы, будь то для развития типов данных или добавления новых полей.
Использование карт и массивов
Для репликации полуструктурированных форматов данных в Delta Lake можно использовать сочетание карт и массивов. Статистические данные нельзя собирать в полях, определенных этими типами, но они обеспечивают сбалансированную производительность как для чтения, так и для записи для полуструктурированных наборов данных, имеющих около 500 полей.
Ключ и значение карт вводимы, поэтому данные предварительно обрабатываются, а схема применяется при записи.
Для ускорения запросов Databricks рекомендует хранить поля, которые часто используются для фильтрации данных в виде отдельных столбцов.
Нужно ли располовать мои данные?
Если данные хранятся с помощью JSON или карт, рассмотрите возможность хранения полей, часто используемых для фильтрации запросов в качестве столбцов. Коллекция статистики, секционирование и кластеризация недоступны для полей в строках ИЛИ картах JSON. Это не нужно делать для данных, хранящихся в виде структур.
Синтаксис для работы с вложенными данными
Ознакомьтесь со следующими ресурсами, чтобы получить сведения о работе с вложенными данными: