# packages

Полезно знать

Доступно начиная с dbt v1.12 или в [канале релизов v1 Latest](https://docs.getdbt.tech/docs/dbt-versions/dbt-release-tracks.md).

functions/\<filename>.yml

```yml
functions:
  - name: <function name>
    config:
      packages: [<string>] # optional, Python UDFs only
```

## Определение

При создании UDF на Python можно использовать необязательную конфигурацию `packages`, чтобы указать общедоступные сторонние пакеты PyPI. Можно перечислить имена пакетов (например, `numpy` и `pandas`) и закрепить их версии (например, `pandas==1.5.0`). Хранилище данных устанавливает эти пакеты при создании UDF, чтобы функция могла использовать возможности внешних библиотек Python.

В Snowflake некоторые пакеты устанавливаются из репозитория Anaconda, и для их использования может потребоваться [принять условия обслуживания Anaconda](https://docs.snowflake.com/en/developer-guide/udf/python/udf-python-packages#using-third-party-packages-from-anaconda).

В настоящее время UDF на Python поддерживаются в Snowflake и BigQuery. Каждое хранилище данных использует свой механизм указания пакетов. Например:

### Snowflake

functions/schema.yml

```yaml
functions:
  - name: is_positive_int
    description: Returns 1 if a_string matches ^[0-9]+$, else 0
    config:
      runtime_version: "3.11"
      entry_point: main
      packages:
        - numpy
        - pandas==1.5.0
    arguments:
      - name: a_string
        data_type: string
    returns:
      data_type: integer
```

Скомпилированный SQL:

```sql
CREATE OR REPLACE FUNCTION my_schema.is_positive_int(a_string STRING)
  RETURNS INTEGER
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.11'
  HANDLER = 'main'
  PACKAGES = ('numpy','pandas==1.5.0')
AS $$
def main(a_string):
    ...
$$
```

### BigQuery

functions/schema.yml

```yaml
functions:
  - name: is_positive_int
    description: Returns 1 if a_string matches ^[0-9]+$, else 0
    config:
      runtime_version: "3.11"
      entry_point: main
      packages:
        - numpy
        - pandas==1.5.0
    arguments:
      - name: a_string
        data_type: string
    returns:
      data_type: integer
```

Скомпилированный SQL:

```sql
CREATE OR REPLACE FUNCTION my_dataset.is_positive_int(a_string STRING)
  RETURNS INT64
  LANGUAGE python
  OPTIONS(
    runtime_version = "python-3.11",
    entry_point = "main",
    packages = ['numpy', 'pandas==1.5.0']
  )
AS r'''
def main(a_string):
    ...
'''
```

## Связанная документация

* [Пользовательские функции](https://docs.getdbt.tech/docs/build/udfs.md)
* [Свойства функций](https://docs.getdbt.tech/reference/function-properties.md)
* [Конфигурации функций](https://docs.getdbt.tech/reference/function-configs.md)
* [runtime\_version](https://docs.getdbt.tech/reference/resource-configs/runtime-version.md)
* [entry\_point](https://docs.getdbt.tech/reference/resource-configs/entry-point.md)
* [type](https://docs.getdbt.tech/reference/resource-configs/type.md)
* [volatility](https://docs.getdbt.tech/reference/resource-configs/volatility.md)
* [arguments](https://docs.getdbt.tech/reference/resource-properties/function-arguments.md)
* [returns](https://docs.getdbt.tech/reference/resource-properties/returns.md)
