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


Работа с соединениями в Azure Databricks

Databricks поддерживает стандартный синтаксис соединения ANSI. В этой статье описываются различия между соединениями с пакетной и потоковой обработкой.

Примечание.

Databricks также поддерживает стандартный синтаксис для операторов набора UNION, INTERSECTи EXCEPT. Смотрите операторы множеств .

Различия между потоковой передачей и пакетными соединениями

Соединения в Azure Databricks могут быть сохраняющими состояние или не сохраняющими состояние.

Все пакетные соединения являются соединениями без сохранения состояния. Результаты обрабатываются немедленно и отражают данные во время выполнения запроса. Каждый раз при выполнении запроса новые результаты вычисляются на основе указанных исходных данных. См. Пакетные соединения.

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

Стрим-статические соединения не сохраняют состояния, но являются отличным вариантом для объединения инкрементного источника данных (например, таблицы фактов) со статическим источником данных (например, медленно изменяющейся размерной таблицей). Вместо объединения всех записей с обеих сторон каждый раз при выполнении запроса только недавно полученные записи из источника потоковой передачи присоединяются к текущей версии статической таблицы. См. статью "Поток-статические соединения".

Пакетные соединения

Azure Databricks поддерживает стандартный синтаксис соединения SQL, включая внутренние, внешние, полу-соединения, анти-соединения и перекрестные соединения. См. JOIN.

Примечание.

Databricks рекомендует использовать материализованное представление для оптимизации добавочного вычисления результатов внутреннего соединения. См. материализованные представления.

Соединения потоков данных

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

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

  • Внутренние соединения
  • Левые внешние соединения
  • Правые внешние соединения
  • Полные внешние соединения
  • Левое полусоединяние

См. документацию по структурированной потоковой передаче Apache Spark о соединениях поток-поток.

Статические объединения потоков

Примечание.

Описанное поведение для потоковых статических соединений предполагает, что статические данные хранятся с помощью Delta Lake.

Объединение потока и статических данных соединяет последнюю допустимую версию таблицы Delta (статические данные) с потоком данных без сохранения состояния.

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

В следующем примере показан этот шаблон:

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")
)

Указания на присоединение к Azure Databricks

Apache Spark поддерживает указание подсказок соединения для диапазонных и скошенных соединений. Подсказки для скошенных соединений не необходимы, так как Azure Databricks автоматически оптимизирует эти соединения. См . подсказки

Подсказки для соединений по диапазону могут быть полезны, если производительность соединения низкая, и вы выполняете соединения с условиями неравенства. Примеры включают присоединение к диапазонам меток времени или диапазону идентификаторов кластеризации. См. Оптимизацию диапазонных соединений и Оптимизацию производительности соединений в Azure Databricks.