Работа с соединениями в Azure Databricks
Databricks поддерживает стандартный синтаксис ANSI join. В этой статье описываются различия между соединениями при пакетной и потоковой обработке и предлагаются рекомендации по оптимизации производительности join.
Примечание.
Databricks также поддерживает стандартный синтаксис для операторов set, UNION
, INTERSECT
и EXCEPT
. См. Set операторов.
Различия между потоковой передачей и пакетными соединениями
Соединения в Azure Databricks являются отслеживанием состояния или без отслеживания состояния.
Все пакетные соединения являются соединениями без отслеживания состояния. Результаты обрабатываются немедленно и отражают данные во время выполнения запроса. Каждый раз при выполнении запроса новые результаты вычисляются на основе указанных исходных данных. См . статью "Пакетные соединения".
Соединения между двумя источниками данных потоковой передачи являются отслеживанием состояния. В соединениях с отслеживанием состояния Azure Databricks отслеживает сведения о источниках данных и результатах и итеративно обновляет результаты. Соединения с отслеживанием состояния могут предоставлять мощные решения для обработки данных в сети, но могут оказаться трудными для эффективной реализации. Они имеют сложную операционную семантику в зависимости от выходного режима, интервала триггера и watermark. См . статью "Соединения потокового потока".
Соединения поток-статик являются без сохранения состояния, но предоставляют хороший вариант для присоединения инкрементного источника данных (например, фактов table) со статическим источником данных (например, медленно изменяющимися источниками измерений table). Вместо объединения всех записей с обеих сторон каждый раз при выполнении запроса только недавно полученные записи из источника потоковой передачи присоединяются к текущей версии статического table. См. статью "Поток-статические соединения".
Пакетные соединения
Azure Databricks поддерживает стандартный синтаксис SQL join, включая внутренние, внешние, полусоединения, анти-соединения и кросс-соединения. См. JOIN.
Примечание.
Databricks рекомендует использовать материализованное представление для optimize инкрементального вычисления результатов внутреннего join. См. использовать материализованный views в SQL Databricks.
Соединения потокового потока
Присоединение двух источников потоковых данных может представлять значительные проблемы в управлении сведениями о состоянии и обоснованием вычислений результатов и выходных данных. Перед реализацией поток-поток joinDatabricks рекомендует разработать четкое представление об операционной семантике потоковой обработки с отслеживанием состояния, включая то, как водяные знаки влияют на управление состоянием. См. следующие статьи:
- Что такое потоковая передача с отслеживанием состояния?
- Применение подложек для контроля пороговых значений обработки данных
- Соединения "поток — поток"
Databricks рекомендует указывать подложки для обеих сторон всех соединений потокового пара. Следующие типы join поддерживаются:
- Внутренние соединения
- Левые внешние соединения
- Правые внешние соединения
- Полные внешние соединения
- Левое полусоединяние
См. документацию по структурированной потоковой передаче Apache Spark в соединениях потоковой передачи.
Статические соединения потоковой передачи
Примечание.
Описанное поведение для потоковых статических соединений предполагает, что статические данные хранятся с помощью Delta Lake.
Потоково-статический join соединяет последнюю действительную версию Delta table (статические данные) с потоком данных с помощью неподдерживающего состояния join.
Когда Azure Databricks обрабатывает микропакет данных в потоке-статике join, последняя допустимая версия данных из статического Delta table присоединяется к записям, присутствующим в текущем микропакете. Поскольку join не имеет состояния, вам не нужно настраивать водяные знаки, и вы можете обрабатывать результаты с низкой задержкой. Данные в статическом Delta table, используемом в join, должны плавно изменяться.
В следующем примере показан этот шаблон:
streamingDF = spark.readStream.table("orders")
staticDF = spark.read.table("customers")
query = (streamingDF
.join(staticDF, streamingDF.customer_id==staticDF.id, "inner")
.writeStream
.option("checkpointLocation", checkpoint_path)
.table("orders_with_customer_info")
)
производительность Optimizejoin
Вычисление с включенной функцией Photon всегда выбирает лучший тип join. См. статью " Что такое Фотон?".
Использование последней версии Среды выполнения Databricks с поддержкой Photon обычно обеспечивает хорошую join производительность, но следует также рассмотреть следующие рекомендации:
Перекрестные соединения очень дороги. Remove перекрестные соединения из рабочих нагрузок и запросов, требующих низкой задержки или частого пересчета.
Join порядок имеет значение. При выполнении нескольких соединений всегда сначала join ваше самое маленькое tables, а затем join результат с более крупными tables.
Оптимизатор может бороться с запросами с множеством соединений и агрегатов. Сохранение промежуточных результатов может ускорить планирование запросов и вычисление результатов.
Сохраняйте свежие статистические данные, чтобы повысить производительность. Прогнозная оптимизация с помощью
ANALYZE
(общедоступная предварительная версия) может автоматически update и поддерживать статистику. Вы также можете выполнить запрос для получения статистики сANALYZE TABLE table_name COMPUTE STATISTICS
до update в планировщике запросов.
Внимание
Прогнозная оптимизация с ANALYZE
общедоступной предварительной версией. Она включает интеллектуальную коллекцию статистики во время записи. Используйте эту форму для регистрации в общедоступной предварительной версии.
Примечание.
В Databricks Runtime 14.3 LTS и более поздних версиях можно изменить columns, которые Delta Lake собирает статистику для пропуска данных, а затем повторно компьютировать существующую статистику в журнале Delta. См. раздел Спецификация статистики Delta columns.
Join рекомендации по Azure Databricks
Apache Spark поддерживает указание подсказок join для соединений по диапазону и перекошенных соединений. Подсказки для скошенных соединений не необходимы, так как Azure Databricks автоматически оптимизирует эти соединения. См . подсказки
Подсказки для соединений диапазона могут быть полезны, если производительность join неудовлетворительна, и вы выполняете соединения с условиями неравенства. Примеры включают присоединение к диапазонам меток времени или диапазону идентификаторов кластеризации. См. оптимизацию join диапазона.