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') }}
),
...
Ссылки на эфемерные модели в настоящее время не поддерживаются (см. запрос на добавление функции)