# Использование BigQuery DataFrames с dbt Python-моделями

[Назад к гайдам](https://docs.getdbt.tech/guides.md)

[Menu ]()



## Введение

В этом руководстве вы узнаете, как настроить dbt для работы с BigQuery DataFrames (BigFrames):

* Построение масштабируемых пайплайнов трансформации данных с использованием dbt и Google Cloud, на SQL и Python.
* Использование BigFrames из dbt для масштабируемых SQL-запросов BigQuery.

В дополнение к уже существующим методам выполнения Python‑моделей на базе dataproc/pyspark, теперь вы можете использовать метод отправки BigFrames для выполнения Python‑моделей с pandas‑подобными и scikit‑подобными API — без необходимости настраивать Spark или разбираться в нём.

BigQuery DataFrames — это open source Python‑пакет, который транслирует код pandas и scikit‑learn в масштабируемый SQL для BigQuery. Адаптер dbt-bigquery использует сервис BigQuery Studio Notebook Executor Service для выполнения клиентского Python‑кода.

* [Аккаунт Google Cloud](https://cloud.google.com/free)
* [Аккаунт dbt](https://www.getdbt.com/signup/)
* Знание SQL и Python на базовом или среднем уровне.
* Базовое понимание основ dbt. Рекомендуем пройти [курс «Основы dbt»](https://learn.getdbt.com).

Во время настройки вам потребуется выбрать адаптер **BigQuery** и указать значения для **Google Cloud Storage Bucket** и **Dataproc Region** в dbt platform. Подробнее см. в разделе [Настройка BigQuery в dbt platform](https://docs.getdbt.tech/guides/dbt-python-bigframes.md?step=2#configure-bigquery-in-the-dbt-platform).

Во время настройки вам потребуется выбрать адаптер **BigQuery (Legacy)** и указать значения для **Google Cloud Storage Bucket** и **Dataproc Region** в dbt platform. Подробности см. в разделе [Configure BigQuery in dbt platform](https://docs.getdbt.tech/guides/dbt-python-bigframes.md?step=2#configure-bigquery-in-the-dbt-platform).

### Что вы создадите

В этом руководстве вы создадите решение из двух частей:

* Настройка проекта Google Cloud
  * Одноразовая настройка проекта Google Cloud, с которым вы будете работать.
* Создание и запуск Python‑модели
  * Создание, конфигурация и выполнение Python‑модели с использованием BigQuery DataFrames и dbt.

Вы настроите окружения, построите масштабируемые пайплайны в dbt и выполните Python‑модель.

[![Реализация метода отправки BigFrames](/img/guides/gcp-guides/gcp-bigframes-architecture.png?v=2 "Реализация метода отправки BigFrames")](#)Реализация метода отправки BigFrames

**Рисунок 1** — Реализация метода отправки BigFrames для Python‑моделей dbt

## Настройте Google Cloud

Метод отправки BigFrames в dbt поддерживает как service account, так и OAuth‑аутентификацию. В следующих шагах будет использоваться service account.

1. **Создайте новый проект Google Cloud**

   a. В новом проекте по умолчанию будет включён список API, включая BigQuery, который является обязательным.

   * [Default APIs](https://cloud.google.com/service-usage/docs/enabled-service#default)

   b. Включите BigQuery API, который автоматически активирует дополнительные API:

   * [BigQuery API's](https://cloud.google.com/bigquery/docs/enable-assets#automatic-api-enablement)

   c. Обязательные API:

   * **BigQuery API:** для всех основных операций BigQuery.
   * **Vertex AI API:** для использования сервиса выполнения Colab Enterprise.
   * **Cloud Storage API:** для хранения кода и логов.
   * **IAM API:** для управления правами доступа.
   * **Compute Engine API:** базовая зависимость для среды выполнения ноутбуков.
   * **Dataform API:** для управления кодовыми артефактами ноутбуков внутри BigQuery.

2. **Создайте service account и выдайте IAM‑права**

   Этот service account будет использоваться dbt для чтения и записи данных в BigQuery, а также для работы с BigQuery Studio Notebooks.

   Создайте service account и назначьте IAM‑права:

   ```python
   #Создать Service Account
   gcloud iam service-accounts create dbt-bigframes-sa
   #Выдать роль BigQuery User
   gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/bigquery.user
   #Выдать роль BigQuery Data Editor. Её можно ограничить на уровне датасета
   gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/bigquery.dataEditor
   #Выдать роль Service Account User
   gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/iam.serviceAccountUser
   #Выдать роль Colab Enterprise User
   gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/aiplatform.colabEnterpriseUser
   ```

   При использовании Shared VPC

   При использовании Colab Enterprise в среде Shared VPC требуются дополнительные роли для следующих service account в хост‑проекте Shared VPC:

   * Vertex AI P4SA (`service-<PROJECT_NUMBER>@gcp-sa-aiplatform.iam.gserviceaccount.com`): этому service account всегда требуется роль Compute Network User (`roles/compute.networkUser`) в хост‑проекте Shared VPC. Замените `<PROJECT_NUMBER>` на номер проекта.
   * Colab Enterprise P6SA (`service-<PROJECT_NUMBER>@gcp-sa-vertex-nb.iam.gserviceaccount.com`): этому service account также требуется роль Compute Network User (`roles/compute.networkUser`) в хост‑проекте Shared VPC. Замените `<PROJECT_NUMBER>` на номер проекта.

3. *(Необязательно)* **Создайте тестовый датасет BigQuery**

   Если у вас ещё нет датасета BigQuery, создайте новый:

   ```python
   #Create BQ dataset 
   bq mk --location=${REGION} echo "${GOOGLE_CLOUD_PROJECT}" | tr '-' '_'_dataset
   ```

4. **Создайте бакет GCS для staging Python‑кода и хранения логов**

   Для временного хранения кода и логов создайте GCS‑bucket и назначьте необходимые права доступа:

   ```python
   #Создать бакет GCS
   gcloud storage buckets create gs://${GOOGLE_CLOUD_PROJECT}-bucket --location=${REGION}
   #Выдать Storage Admin на бакет вашему SA

   gcloud storage buckets add-iam-policy-binding gs://${GOOGLE_CLOUD_PROJECT}-bucket --member=serviceAccount:dbt-bigframes-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com --role=roles/storage.admin
   ```

### Настройте BigQuery в dbt platform

Чтобы настроить подключение BigQuery DataFrames в dbt platform, выполните следующие действия:

1. Перейдите в **Account settings** > **Connections**. Нажмите **New connection**.

2. В разделе **Type** выберите **BigQuery**.

3. Выберите **BigQuery** в качестве адаптера.

4. В разделе **Optional settings** укажите значения следующих полей:

   * **Google Cloud Storage Bucket** (например: `dbt_name_bucket`)
   * **Dataproc Region** (например: `us-central1`)

5. Нажмите **Save**.

Эта настройка необходима для корректного выполнения заданий BigFrames.

Подробнее о подключении к BigQuery в dbt platform см. в разделе [Подключение к BigQuery](https://docs.getdbt.tech/docs/platform/connect-data-platform/connect-bigquery.md).

Дополнительную информацию см. в разделе [Connect to BigQuery](https://docs.getdbt.tech/docs/platform/connect-data-platform/connect-bigquery.md).

[![Настройте BigQuery в dbt platform](/img/guides/gcp-guides/dbt-platform-bq.png?v=2 "Настройте BigQuery в dbt platform")](#)Настройте BigQuery в dbt platform

## Создайте, настройте и выполните ваши Python‑модели

1. В вашем dbt‑проекте создайте SQL‑модель в каталоге `models` с расширением `.sql`. Назовите файл `my_sql_model.sql`.

2. Скопируйте в файл следующий SQL‑код:

   ```sql
      select 
      1 as foo,
      2 as bar
   ```

3. Создайте новый файл модели в каталоге `models` с именем `my_first_python_model.py`.

4. В файле `my_first_python_model.py` добавьте следующий код:

   ```python
   def model(dbt, session):
      dbt.config(submission_method="bigframes")
      bdf = dbt.ref("my_sql_model") #loading from prev step
      return bdf
   ```

5. Настройте метод отправки BigFrames одним из способов:

   a. Конфигурация на уровне проекта через `dbt_project.yml`:

   ```python
   models:
   my_dbt_project:
      submission_method: bigframes
      python_models:
         +materialized: view
   ```

   или

   b. Конфигурация непосредственно в Python‑коде через `dbt.config` в файле `my_first_python_model.py`:

   ```python
   def model(dbt, session):
      dbt.config(submission_method="bigframes")
      # rest of the python code...
   ```

6. Выполните команду `dbt run`.

7. Логи выполнения можно посмотреть в [dbt logs](https://docs.getdbt.tech/reference/events-logging.md). При необходимости вы также можете просмотреть код и логи (включая предыдущие запуски) на вкладке [Colab Enterprise Executions](https://console.cloud.google.com/vertex-ai/colab/execution-jobs) и в [GCS bucket](https://console.cloud.google.com/storage/browser) в консоли GCP.

8. Поздравляем! Вы только что создали свои первые две Python‑модели, которые выполняются на BigFrames!
