Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Observação
Este artigo aborda o Databricks Connect para o Databricks Runtime 13.3 e versões superiores.
O Databricks Connect for Python suporta funções definidas pelo usuário (UDF). Quando uma operação DataFrame que inclui UDFs é executada, as UDFs são serializadas pelo Databricks Connect e enviadas ao servidor como parte da solicitação.
Para obter informações sobre UDFs para Databricks Connect for Scala, consulte Funções definidas pelo usuário no Databricks Connect for Scala.
Observação
Como a função definida pelo usuário é serializada e desserializada, a versão Python do cliente deve corresponder à versão Python na computação do Azure Databricks. Para versões suportadas, consulte a matriz de suporte da versão .
Definir uma UDF
Para criar um UDF no Databricks Connect for Python, use uma das seguintes funções suportadas:
- Funções definidas pelo usuário do PySpark
- Funções de streaming PySpark
Por exemplo, o Python a seguir configura um UDF simples que quadra os valores em uma coluna.
from pyspark.sql.functions import col, udf
from pyspark.sql.types import IntegerType
from databricks.connect import DatabricksSession
@udf(returnType=IntegerType())
def double(x):
return x * x
spark = DatabricksSession.builder.getOrCreate()
df = spark.range(1, 2)
df = df.withColumn("doubled", double(col("id")))
df.show()
UDFs com dependências
Importante
Esse recurso está no Public Preview e requer o Databricks Connect para Python 16.4 ou superior e um cluster executando o Databricks Runtime 16.4 ou superior. Para usar esse recurso, habilite a visualização UDFs Python aprimoradas no Unity Catalog em seu espaço de trabalho.
O Databricks Connect suporta a especificação de dependências Python que são necessárias para UDFs. Essas dependências são instaladas na plataforma Databricks como parte do ambiente Python da UDF.
Esse recurso permite que os usuários especifiquem dependências que o UDF precisa além dos pacotes fornecidos no ambiente base. Ele também pode ser usado para instalar uma versão diferente do pacote do que é fornecido no ambiente base.
As dependências podem ser instaladas a partir das seguintes fontes:
- Pacotes PyPI
- Os pacotes PyPI podem ser especificados de acordo com o PEP 508, por exemplo,
dicepyjokes<1ousimplejson==3.19.*.
- Os pacotes PyPI podem ser especificados de acordo com o PEP 508, por exemplo,
- Arquivos armazenados em volumes do Catálogo Unity
- Ambos os arquivos wheel (
.whl) e os arquivos tar compactados (.tar.gz) são suportados. O utilizador deve receber permissãoREAD_FILEno ficheiro no volume re:[UC]. - Ao instalar pacotes a partir de volumes do Catálogo Unity, para invocar os UDFs, os usuários precisam de
READ VOLUMEpermissão no volume de origem. Conceder essa permissão a todos os usuários da conta habilita isso automaticamente para novos usuários. - Os arquivos de volumes do Catálogo Unity devem ser especificados como
dbfs:<path>, por exemplo,dbfs:/Volumes/users/someone@example.com/wheels/my_private_dep.whloudbfs:/Volumes/users/someone@example.com/tars/my_private_deps.tar.gz.
- Ambos os arquivos wheel (
Para incluir dependências personalizadas em seu UDF, especifique-as em um ambiente usando withDependencieso e, em seguida, use esse ambiente para criar uma sessão do Spark. As dependências são instaladas na sua infraestrutura computacional Databricks e estarão disponíveis em todas as UDFs que utilizam esta sessão do Spark.
O código a seguir declara o pacote dice PyPI como uma dependência:
from databricks.connect import DatabricksSession, DatabricksEnv
env = DatabricksEnv().withDependencies("dice==3.1.0")
spark = DatabricksSession.builder.withEnvironment(env).getOrCreate()
Ou, para especificar uma dependência de uma roda em um volume:
from databricks.connect import DatabricksSession, DatabricksEnv
env = DatabricksEnv().withDependencies("dbfs:/Volumes/users/someone@example.com/wheels/my_private_dep.whl")
spark = DatabricksSession.builder.withEnvironment(env).getOrCreate()
Comportamento em notebooks e tarefas Databricks
Em notebooks e trabalhos, as dependências UDF precisam ser instaladas diretamente no REPL. O Databricks Connect valida o ambiente REPL Python verificando se todas as dependências especificadas já estão instaladas e lança uma exceção se alguma não estiver instalada.
A validação do ambiente de notebook é realizada para as dependências de volume do PyPI e do Unity Catalog. As dependências de volume precisam ser empacotadas seguindo as especificações de empacotamento Python padrão do PEP-427 ou posterior para arquivos de roda e PEP-241 ou posterior para arquivos de distribuição de origem. Para obter mais informações sobre padrões de empacotamento Python, consulte a documentação do PyPA.
Limitações
- Arquivos como roda Python ou distribuição de código-fonte em sua máquina de desenvolvimento local não podem ser especificados diretamente como uma dependência. Eles devem primeiro ser carregados nos volumes do Catálogo Unity.
- O suporte de dependências UDF para
pyspark.sql.streaming.DataStreamWriter.foreachepyspark.sql.streaming.DataStreamWriter.foreachBatchrequer Databricks Connect para Python 18.0 ou superior, e um cluster a correr Databricks Runtime 18.0 ou superior. - As dependências de UDF não são suportadas para UDFs de agregação de pandas sobre funções de janela.
Exemplos
O exemplo a seguir define dependências de PyPI e volumes em um ambiente, cria uma sessão com esse ambiente e, em seguida, define e chama UDFs que usam essas dependências:
from databricks.connect import DatabricksSession, DatabricksEnv
from pyspark.sql.functions import udf, col, pandas_udf
from pyspark.sql.types import IntegerType, LongType, StringType
import pandas as pd
pypi_deps = ["pyjokes>=0.8,<1"]
volumes_deps = [
# Example library from: https://pypi.org/project/dice/#files
"dbfs:/Volumes/main/someone@example.com/test/dice-4.0.0-py3-none-any.whl"
# Example library from: https://pypi.org/project/simplejson/#files
"dbfs:/Volumes/main/someone@example.com/test/simplejson-3.19.3.tar.gz",
]
env = DatabricksEnv().withDependencies(pypi_deps).withDependencies(volumes_deps)
spark = DatabricksSession.builder.withEnvironment(env).getOrCreate()
# UDFs
@udf(returnType=StringType())
def get_joke():
from pyjokes import get_joke
return get_joke()
@udf(returnType=IntegerType())
def double_and_json_parse(x):
import simplejson
return simplejson.loads(simplejson.dumps(x * 2))
@pandas_udf(returnType=LongType())
def multiply_and_add_roll(a: pd.Series, b: pd.Series) -> pd.Series:
import dice
return a * b + dice.roll(f"1d10")[0]
df = spark.range(1, 10)
df = df.withColumns({
"joke": get_joke(),
"doubled": double_and_json_parse(col("id")),
"mutliplied_with_roll": multiply_and_add_roll(col("id"), col("doubled"))
})
df.show()
Ambiente base Python
UDFs são executados na computação da Databricks e não no cliente. O ambiente Python base no qual UDFs são executados depende da computação do Databricks.
Para clusters, o ambiente Python base é o ambiente Python da versão do Databricks Runtime em execução no cluster. A versão do Python e a lista de pacotes neste ambiente base são encontradas nas seções Ambiente do sistema e Bibliotecas Python instaladas das notas de versão do Databricks Runtime.
Para computação sem servidor, o ambiente Python base corresponde à versão do ambiente sem servidor de acordo com a tabela a seguir.
| Versão do Databricks Connect | Ambiente UDF sem servidor |
|---|---|
| 17.0 a 17.3, Python 3.12 | Versão 4 |
| 16.4.1 até abaixo de 17, Python 3.12 | Versão 3 |
| 15.4.10 para abaixo de 16, Python 3.12 | Versão 3 |
| 15.4.10 até abaixo de 16, Python 3.11 | Versão 2 |
| 15.4.0 a 15.4.9 e 16.0 a 16.3 | Computação sem servidor mais recente. Migre para 15.4.10 LTS e superior ou 16.4.1 LTS e superior para um ambiente Python estável. |