Python модели
Обратите внимание, что только определенные платформы данных поддерживают модели dbt-py.
Мы рекомендуем вам:
- Прочитать оригинальное обсуждение, в котором было предложено это нововведение.
- Внести свой вклад в лучшие практики разработки Python моделей в dbt.
- Поделиться своими мыслями и идеями о следующих шагах для Python моделей.
- Присоединиться к каналу #dbt-core-python-models в сообществе dbt в Slack.
Обзор
Python модели dbt (dbt-py) могут помочь вам решить задачи, которые невозможно решить с помощью SQL. Вы можете выполнять анализы, используя инструменты, доступные в экосистеме Python с открытым исходным кодом, включая передовые пакеты для науки о данных и статистики. Ранее вам требовалась бы отдельная инфраструктура и оркестрация для выполнения Python трансформаций в производственной среде. Python трансформации, определенные в dbt, являются моделями в вашем проекте с теми же возможностями тестирования, документации и отслеживания.
import ...
def model(dbt, session):
my_sql_model_df = dbt.ref("my_sql_model")
final_df = ... # то, что нельзя написать на SQL!
return final_df
version: 2
models:
- name: my_python_model
# Документируйте в том же коде
description: Моя трансформация, написанная на Python
# Настройте интуитивно и привычно
config:
materialized: table
tags: ['python']
# Тестируйте результаты моей Python трансформации
columns:
- name: id
# Стандартная проверка для 'grain' результатов Python
tests:
- unique
- not_null
tests:
# Напишите свою собственную логику проверки (на SQL) для результатов Python
- custom_generic_test
Предварительные условия для Python моделей dbt включают использование адаптера для платформы данных, поддерживающей полноценное выполнение Python. В Python модели dbt весь Python код выполняется удаленно на платформе. Ничего из этого не выполняется dbt локально. Мы верим в четкое разделение определения модели от выполнения модели. В этом и во многих других аспектах подход dbt к Python моделям отражает его давний подход к моделированию данных в SQL.
Мы написали это руководство, предполагая, что вы знакомы с dbt. Если вы никогда раньше не писали модель dbt, мы рекомендуем начать с чтения dbt Models. На протяжении всего текста мы будем проводить параллели между Python моделями и SQL моделями, а также четко указывать их различия.
Что такое Python модель?
Python модель dbt — это функция, которая читает источники dbt или другие модели, применяет серию трансформаций и возвращает преобразованный набор данных. Операции DataFrame определяют начальные точки, конечное состояние и каждый шаг на пути.
Это похоже на роль CTE в SQL моделях dbt. Мы используем CTE для извлечения данных из вышестоящих наборов данных, определения (и именования) серии значимых трансформаций и завершения с помощью финального оператора select. Вы можете зап устить скомпилированную версию SQL модели dbt, чтобы увидеть данные, включенные в результирующее представление или таблицу. Когда вы выполняете dbt run, dbt оборачивает этот запрос в create view, create table или более сложные DDL, чтобы сохранить его результаты в базе данных.
Вместо финального оператора select каждая Python модель возвращает финальный DataFrame. Каждая операция DataFrame "лениво оценивается". В процессе разработки вы можете предварительно просмотреть его данные, используя методы, такие как .show() или .head(). Когда вы запускаете Python модель, полный результат финального DataFrame будет сохранен как таблица в вашем хранилище данных.
Python модели dbt имеют доступ почти ко всем тем же параметрам конфигурации, что и SQL модели. Вы можете тестировать и документировать их, добавлять свойства tags и meta, а также предоставлять доступ к их результатам другим пользователям. Вы можете выбирать их по имени, пути к файлу, конфигурациям, в зависимости от того, являются ли они вышестоящими или нижестоящими по отношению к другой модели, или если они были изменены по сравнению с предыдущи м состоянием проекта.
Определение Python модели
Каждая Python модель находится в файле .py в вашей папке models/. Она определяет функцию с именем model(), которая принимает два параметра:
dbt: Класс, скомпилированный dbt Core, уникальный для каждой модели, позволяет вам запускать ваш Python код в контексте вашего проекта dbt и DAG.session: Класс, представляющий соединение вашей платформы данных с Python бэкендом. Сессия необходима для чтения таблиц как DataFrame и записи DataFrame обратно в таблицы. В PySpark, по соглашению,SparkSessionназываетсяsparkи доступен глобально. Для согласованности между платформами мы всегда передаем его в функциюmodelкак явный аргумент, называемыйsession.
Функция model() должна возвращать один DataFrame. На Snowpark (Snowflake) это может быть Snowpark или pandas DataFrame. Через PySpark (Databricks + BigQuery) это может быть Spark, pandas или pandas-on-Spark DataFrame. Для получения дополнительной информации о выборе между pandas и нативными DataFrame, см. API и синтаксис DataFrame.
Когда вы выполняете dbt run --select python_model, dbt подготовит и передаст оба аргумента (dbt и session). Все, что вам нужно сделать, это определить функцию. Вот как должна выглядеть каждая Python модель:
def model(dbt, session):
...
return final_df
Ссылки на другие модели
Python модели полностью участвуют в направленном ациклическом графе (DAG) трансформаций dbt. Используйте метод dbt.ref() в Python модели, чтобы читать данные из других моделей (SQL или Python). Если вы хотите читать напрямую из исходной таблицы, используйте dbt.source(). Эти методы возвращают DataFrame, указывающие на вышестоящий источник, модель, seed или snapshot.
def model(dbt, session):
# DataFrame, представляющий вышестоящую модель
upstream_model = dbt.ref("upstream_model_name")
# DataFrame, представляющий вышестоящий источник
upstream_source = dbt.source("upstream_source_name", "table_name")
...
Конечно, вы можете использовать ref() для вашей Python модели в нижестоящих SQL моделях:
with upstream_python_model as (
select * from {{ ref('my_python_model') }}
),
...
Ссылки на эфемерные модели в настоящее время не поддерживаются (см. запрос на добавление функции)
