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


Материализованные представления

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

Материализованное представление — это декларативный объект потока обработки данных. Он включает запрос , определяющий его, поток обновления и кэшированные результаты для быстрого доступа. Материализованное представление:

  • Отслеживает изменения в восходящих данных.
  • При активации постепенно обрабатывает измененные данные и применяет необходимые преобразования.
  • Поддерживает выходную таблицу в синхронизации с исходными данными на основе указанного интервала обновления.

Материализованные представления являются хорошим выбором для многих преобразований:

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

Как материализованные представления работают

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

Схема , показывающая, как работают материализованные представления

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

При создании материализованного представления за пределами конвейера в Databricks SQL, Databricks создает скрытый конвейер, который используется для обновления представления.

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

Следующий пример объединяет две таблицы и сохраняет результат в актуальном состоянии с помощью материализованного представления.

Питон

import dlt

@dlt.table
def regional_sales():
  partners_df = spark.read.table("partners")
  sales_df = spark.read.table("sales")

  return (
    partners_df.join(sales_df, on="partner_id", how="inner")
  )

При использовании одного или нескольких spark.readStream вызовов в методе он изменяет представление в таблицу потоковой передачи вместо материализованного представления.

SQL

CREATE OR REPLACE MATERIALIZED VIEW regional_sales
  AS SELECT *
  FROM partners
    INNER JOIN sales ON
      partners.partner_id = sales.partner_id;

Автоматические инкрементные обновления

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

На схеме ниже показано материализованное представление sales_report, которое является результатом объединения двух вышестоящих таблиц clean_customers и clean_transactionsгруппирования по странам. Вышестоящий процесс вставляет 200 строк в clean_customers для трех стран (США, Нидерланды, Великобритания) и обновляет 5000 строк в clean_transactions в соответствии с этими новыми клиентами. Материализованное sales_report представление постепенно обновляется только для стран с новыми клиентами или соответствующими транзакциями. В этом примере мы видим три строки, обновленные вместо всего отчета о продажах.

Пример инкрементального обновления материализованного представления

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

Ограничения материализованных представлений

Материализованные представления имеют следующие ограничения:

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