Поделиться через


Запрос данных

Запрос данных — это базовый шаг для выполнения практически всех задач на основе данных в Azure Databricks. Независимо от используемого языка или инструмента рабочие нагрузки начинаются с определения запроса к таблице или другому источнику данных, а затем выполняют действия для получения аналитических сведений от данных. В этой статье описаны основные понятия и процедуры выполнения запросов в различных предложениях продуктов Azure Databricks, а также примеры кода, которые можно адаптировать для вашего варианта использования.

Данные можно запрашивать в интерактивном режиме с помощью:

  • Записные книжки
  • Редактор SQL
  • Редактор файлов
  • Панели мониторинга

Вы также можете выполнять запросы в составе конвейеров или заданий Delta Live Tables.

Общие сведения о потоковых запросах в Azure Databricks см. в разделе "Запрос потоковой передачи данных".

Какие данные можно запрашивать с помощью Azure Databricks?

Azure Databricks поддерживает запросы данных в нескольких форматах и корпоративных системах. Данные, которые вы запрашиваете с помощью Azure Databricks, попадают в одну из двух общих категорий: данные в databricks lakehouse и внешних данных.

Какие данные есть в Databricks lakehouse?

Платформа аналитики данных Databricks хранит все данные в lakehouse Databricks по умолчанию.

Это означает, что при выполнении базового CREATE TABLE оператора для создания новой таблицы вы создали таблицу Lakehouse. Данные Lakehouse имеют следующие свойства:

  • Хранится в формате Delta Lake.
  • Хранится в облачном хранилище объектов.
  • Управляется каталогом Unity.

Большинство данных Lakehouse в Azure Databricks зарегистрированы в каталоге Unity в качестве управляемых таблиц. Управляемые таблицы предоставляют самый простой синтаксис и ведут себя так же, как и другие таблицы в большинстве систем управления реляционными базами данных. Управляемые таблицы рекомендуется для большинства вариантов использования и подходят для всех пользователей, которые не хотят беспокоиться о реализации хранилища данных.

Неуправляемая таблица или внешняя таблица является таблицей, зарегистрированной LOCATION в указанном формате. Термин внешний может быть вводящим в заблуждение, так как внешние таблицы Delta по-прежнему являются данными lakehouse. Неуправляемые таблицы могут быть предпочтительнее пользователями, которые напрямую обращаются к таблицам из других клиентов чтения Delta. Общие сведения о различиях в семантике таблиц см. в разделе "Что такое таблицы и представления?".

Некоторые устаревшие рабочие нагрузки могут взаимодействовать исключительно с данными Delta Lake через пути к файлам и не регистрировать таблицы вообще. Эти данные по-прежнему являются lakehouse, но могут быть более сложными для обнаружения, так как они не зарегистрированы в каталоге Unity.

Примечание.

Возможно, администратор рабочей области не обновил управление данными, чтобы использовать каталог Unity. Вы по-прежнему можете получить множество преимуществ Озера Databricks без каталога Unity, но не все функции, перечисленные в этой статье или в документации по Azure Databricks.

Какие данные считаются внешними?

Любые данные, которые не относятся к Databricks lakehouse, можно считать внешними данными. Ниже приведены некоторые примеры внешних данных:

  • Иностранные таблицы, зарегистрированные в Федерации Lakehouse.
  • Таблицы в хранилище метаданных Hive, поддерживаемые Parquet.
  • Внешние таблицы в каталоге Unity, поддерживаемые JSON.
  • CSV-данные, хранящиеся в облачном хранилище объектов.
  • Потоковая передача данных из Kafka.

Azure Databricks поддерживает настройку подключений ко многим источникам данных. См. статью "Подключение к источникам данных".

Хотя вы можете использовать каталог Unity для управления доступом к таблицам и определения таблиц для данных, хранящихся в нескольких форматах и внешних системах, Delta Lake является требованием для рассмотрения данных в lakehouse.

Delta Lake предоставляет все гарантии транзакций в Azure Databricks, которые являются важными для поддержания целостности и согласованности данных. Если вы хотите узнать больше о гарантиях транзакций в данных Azure Databricks и почему они важны, см. сведения о гарантиях ACID в Azure Databricks?.

Большинство пользователей Azure Databricks запрашивают сочетание данных Lakehouse и внешних данных. Подключение с внешними данными всегда является первым шагом для приема данных и конвейеров ETL, которые переносят данные в lakehouse. Сведения о приеме данных см . в разделе "Прием данных" в databricks lakehouse.

Запрос таблиц по имени

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

Если вы используете каталог Unity, таблицы используют трехуровневое пространство имен со следующим форматом: <catalog-name>.<schema-name>.<table-name>

Без каталога Unity идентификаторы таблиц используют формат <schema-name>.<table-name>.

Примечание.

Azure Databricks наследует большую часть синтаксиса SQL от Apache Spark, который не отличается от SCHEMA и DATABASE.

Запрос по имени таблицы поддерживается во всех контекстах выполнения Azure Databricks и поддерживаемых языках.

SQL

SELECT * FROM catalog_name.schema_name.table_name

Python

spark.read.table("catalog_name.schema_name.table_name")

Запрос данных по пути

Структурированные, полуструктурированные и неструктурированные данные можно запрашивать с помощью путей к файлам. Большинство файлов в Azure Databricks поддерживаются облачным хранилищем объектов. См. статью " Работа с файлами в Azure Databricks".

Databricks рекомендует настроить весь доступ к облачному хранилищу объектов с помощью каталога Unity и определить тома для расположений хранилища объектов, которые запрашиваются напрямую. Тома предоставляют доступные для чтения псевдонимы расположения и файлы в хранилище облачных объектов с помощью имен каталога и схем для файлового пути. См. статью "Подключение к облачному хранилищу объектов" с помощью каталога Unity.

В следующих примерах показано, как использовать пути тома каталога Unity для чтения данных JSON:

SQL

SELECT * FROM json.`/Volumes/catalog_name/schema_name/volume_name/path/to/data`

Python

spark.read.format("json").load("/Volumes/catalog_name/schema_name/volume_name/path/to/data")

Для облачных расположений, которые не настроены в качестве томов каталога Unity, можно запрашивать данные непосредственно с помощью URI. Для запроса данных с помощью URI необходимо настроить доступ к облачному хранилищу объектов. Сведения о настройке доступа к облачному хранилищу объектов для Azure Databricks.

В следующих примерах показано, как использовать URI для запроса данных JSON в Azure Data Lake Storage 2-го поколения, GCS и S3:

SQL

SELECT * FROM json.`abfss://container-name@storage-account-name.dfs.core.windows.net/path/to/data`;

SELECT * FROM json.`gs://bucket_name/path/to/data`;

SELECT * FROM json.`s3://bucket_name/path/to/data`;

Python

spark.read.format("json").load("abfss://container-name@storage-account-name.dfs.core.windows.net/path/to/data")

spark.read.format("json").load("gs://bucket_name/path/to/data")

spark.read.format("json").load("s3://bucket_name/path/to/data")

Запрос данных с помощью хранилищ SQL

Azure Databricks использует хранилища SQL для вычислений в следующих интерфейсах:

  • Редактор SQL
  • Запросы SQL Databricks
  • Панели мониторинга
  • Устаревшие панели мониторинга
  • Оповещения SQL

При необходимости можно использовать хранилища SQL со следующими продуктами:

  • Записные книжки Databricks
  • Редактор файлов Databricks
  • Задания Databricks

При запросе данных с помощью хранилищ SQL можно использовать только синтаксис SQL. Другие языки программирования и API не поддерживаются.

Для рабочих областей, которые включены для каталога Unity, хранилища SQL всегда используют каталог Unity для управления доступом к источникам данных.

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

Использование URI непосредственно в запросах, выполняемых в хранилищах SQL, может привести к непредвиденным ошибкам.

Запрос данных с помощью всех вычислений или заданий назначения

Большинство запросов, выполняемых из записных книжек Databricks, рабочих процессов и редактора файлов, выполняются в вычислительных кластерах, настроенных с помощью Databricks Runtime. Эти кластеры можно настроить для интерактивного запуска или развертывания в качестве заданий вычислений , которые работают в рабочих процессах. Databricks рекомендует всегда использовать вычисления заданий для неинтерактивных рабочих нагрузок.

Интерактивные и неинтерактивные рабочие нагрузки

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

Apache Spark использует отложенное выполнение кода, что означает, что результаты вычисляются только по мере необходимости, а несколько преобразований или запросов к источнику данных можно оптимизировать как один запрос, если вы не принудительно получите результаты. Это отличается от активного режима выполнения, используемого в pandas, который требует обработки вычислений в порядке перед передачей результатов в следующий метод.

Если ваша цель состоит в сохранении чистых, преобразованных, агрегированных данных в виде нового набора данных, необходимо удалить запросы, отображающие результаты из кода, прежде чем планировать его выполнение.

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