Consultar dados no Azure Synapse Analytics

Você pode acessar o Azure Synapse do Databricks usando o conector do Azure Synapse, que usa a instrução COPY no Azure Synapse para transferir grandes volumes de dados de forma eficiente entre clusters do Databricks e uma instância do Azure Synapse usando uma account de armazenamento do Azure Data Lake Storage Gen2 para uso temporário. encenação.

Experimental

As configurações descritas neste artigo são Experimentais. Os recursos experimentais são fornecidos como estão e não são suportados pelo Databricks por meio do suporte técnico ao cliente. Para obter suporte completo à federação query , você deve usar lakehouse Federation, que permite que os usuários do Databricks aproveitem a sintaxe do Unity Catalog e as ferramentas de governança de dados.

O Azure Synapse Analytics é um data warehouse empresarial baseado cloudsque aproveita o processamento massivamente paralelo (MPP) para executar rapidamente query complexas em petabytes de dados.

Importante

Este conector deve ser usado apenas com instâncias de pool dedicado do Synapse e não é compatível com outros componentes do Synapse.

Observação

COPY está disponível apenas em instâncias do Azure Data Lake Storage Gen2. Se você estiver procurando detalhes sobre como trabalhar com o Polybase, consulte Conectando Databricks e Azure Synapse com PolyBase (legado).

Sintaxe de exemplo para Synapse

Você pode o query Synapse em Scala, Python, SQL e R. Os exemplos de código a seguir usam de armazenamento account key e encaminham as credenciais de armazenamento do Databricks para o Synapse.

Observação

Utilize as strings de ligação fornecidas pelo portal Azure, que permite a encriptação SSL (Secure Sockets Layer) para todos os dados enviados entre o condutor Spark e a instância Azure Synapse através da ligação JDBC. Para verificar se a criptografia SSL está ativada, você pode procurar por encrypt=true nas strings de conexão.

Importante

Os locais externos definidos no Unity Catalog não são suportados como locais tempDir.

// Set up the storage account access key in the notebook session conf.
spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

// Get some data from an Azure Synapse table. The following example applies to Databricks Runtime 11.3 LTS and above.
val df: DataFrame = spark.read
  .format("sqldw")
  .option("host", "hostname")
  .option("port", "port") /* Optional - will use default port 1433 if not specified. */
  .option("user", "username")
  .option("password", "password")
  .option("database", "database-name")
  .option("dbtable", "schema-name.table-name") /* If schemaName not provided, default to "dbo". */
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .load()

// Get some data from an Azure Synapse table. The following example applies to Databricks Runtime 10.4 LTS and below.
val df: DataFrame = spark.read
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("dbTable", "<your-table-name>")
  .load()

// Load data from an Azure Synapse query.
val df: DataFrame = spark.read
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("query", "select x, count(*) as cnt from table group by x")
  .load()

// Apply some transformations to the data, then use the
// Data Source API to write the data back to another table in Azure Synapse.

df.write
  .format("com.databricks.spark.sqldw")
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .option("dbTable", "<your-table-name>")
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .save()

# Set up the storage account access key in the notebook session conf.
spark.conf.set(
  "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net",
  "<your-storage-account-access-key>")

# Get some data from an Azure Synapse table. The following example applies to Databricks Runtime 11.3 LTS and above.
df = spark.read
  .format("sqldw")
  .option("host", "hostname")
  .option("port", "port") # Optional - will use default port 1433 if not specified.
  .option("user", "username")
  .option("password", "password")
  .option("database", "database-name")
  .option("dbtable", "schema-name.table-name") # If schemaName not provided, default to "dbo".
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")
  .option("forwardSparkAzureStorageCredentials", "true")
  .load()

# Get some data from an Azure Synapse table. The following example applies to Databricks Runtime 10.4 LTS and below.
df = spark.read \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "<your-table-name>") \
  .load()

# Load data from an Azure Synapse query.
df = spark.read \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("query", "select x, count(*) as cnt from table group by x") \
  .load()

# Apply some transformations to the data, then use the
# Data Source API to write the data back to another table in Azure Synapse.

df.write \
  .format("com.databricks.spark.sqldw") \
  .option("url", "jdbc:sqlserver://<the-rest-of-the-connection-string>") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("dbTable", "<your-table-name>") \
  .option("tempDir", "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>") \
  .save()
-- Set up the storage account access key in the notebook session conf.
SET fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net=<your-storage-account-access-key>;

-- Read data using SQL. The following example applies to Databricks Runtime 11.3 LTS and above.
CREATE TABLE example_table_in_spark_read
USING sqldw
OPTIONS (
  host '<hostname>',
  port '<port>' /* Optional - will use default port 1433 if not specified. */
  user '<username>',
  password '<password>',
  database '<database-name>'
  dbtable '<schema-name>.<table-name>', /* If schemaName not provided, default to "dbo". */
  forwardSparkAzureStorageCredentials 'true',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>'
);

-- Read data using SQL. The following example applies to Databricks Runtime 10.4 LTS and below.
CREATE TABLE example_table_in_spark_read
USING com.databricks.spark.sqldw
OPTIONS (
  url 'jdbc:sqlserver://<the-rest-of-the-connection-string>',
  forwardSparkAzureStorageCredentials 'true',
  dbtable '<your-table-name>',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>'
);

-- Write data using SQL.
-- Create a new table, throwing an error if a table with the same name already exists:

CREATE TABLE example_table_in_spark_write
USING com.databricks.spark.sqldw
OPTIONS (
  url 'jdbc:sqlserver://<the-rest-of-the-connection-string>',
  forwardSparkAzureStorageCredentials 'true',
  dbTable '<your-table-name>',
  tempDir 'abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>'
)
AS SELECT * FROM table_to_save_in_spark;
# Load SparkR
library(SparkR)

# Set up the storage account access key in the notebook session conf.
conf <- sparkR.callJMethod(sparkR.session(), "conf")
sparkR.callJMethod(conf, "set", "fs.azure.account.key.<your-storage-account-name>.dfs.core.windows.net", "<your-storage-account-access-key>")

# Get some data from an Azure Synapse table.
df <- read.df(
   source = "com.databricks.spark.sqldw",
   url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
   forward_spark_azure_storage_credentials = "true",
   dbTable = "<your-table-name>",
   tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

# Load data from an Azure Synapse query.
df <- read.df(
   source = "com.databricks.spark.sqldw",
   url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
   forward_spark_azure_storage_credentials = "true",
   query = "select x, count(*) as cnt from table group by x",
   tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

# Apply some transformations to the data, then use the
# Data Source API to write the data back to another table in Azure Synapse.

write.df(
  df,
  source = "com.databricks.spark.sqldw",
  url = "jdbc:sqlserver://<the-rest-of-the-connection-string>",
  forward_spark_azure_storage_credentials = "true",
  dbTable = "<your-table-name>",
  tempDir = "abfss://<your-container-name>@<your-storage-account-name>.dfs.core.windows.net/<your-directory-name>")

Como funciona a autenticação entre Databricks e Synapse?

O conector Azure Synapse utiliza três tipos de ligações de rede:

  • Driver Spark para Azure Synapse

  • clusters Spark para accountde armazenamento do Azure

  • Azure Synapse para accountde armazenamento do Azure

Configurar o acesso ao armazenamento do Azure

Tanto o Databricks quanto o Synapse precisam de acesso privilegiado a uma account de armazenamento do Azure para ser usada para armazenamento temporário de dados.

O Azure Synapse não dá suporte ao uso de SAS para acesso account de armazenamento. Você pode configurar o acesso para ambos os serviços seguindo um destes procedimentos:

Permissões necessárias do Azure Synapse

Como usa COPY em segundo plano, o conector do Azure Synapse exige que o usuário da conexão JDBC tenha permissão para executar o seguinte comando na instância conectada do Azure Synapse:

Se a tabela de destino não existir no Azure Synapse, será necessária permissão para executar o seguinte comando, além do comando acima:

A tabela a seguir resume as permissões necessárias para gravações com COPY:

Permissões (inserir em uma tabela existente)

Permissões (inserir em uma nova tabela)

ADMINISTRAR BANCO DE DADOS DE TRANSAÇÕES EM GRANEL

INSERT

ADMINISTRAR BANCO DE DADOS DE TRANSAÇÕES EM GRANEL

INSERT

CREATE TABLE

ALTERAR NO ESQUEMA :: dbo

Configurar a conexão do Databricks ao Synapse com OAuth 2.0 com uma entidade de serviço

Você pode autenticar no Azure Synapse Analytics usando uma entidade de serviço com acesso à account de armazenamento subjacente. Para obter mais informações sobre a utilização de credenciais de entidade de serviço para aceder a uma account de armazenamento do Azure, consulte Ligação ao Azure Data Lake Storage Gen2 e Blob Storage. Você deve definir a opção enableServicePrincipalAuth como true na referência de opções do conector Databricks Synapse de configuração de conexão para permitir que o conector seja autenticado com uma entidade de serviço.

Opcionalmente, você pode usar uma entidade de serviço diferente para a conexão do Azure Synapse Analytics. O exemplo a seguir configura credenciais de entidade de serviço para a account de armazenamento e credenciais opcionais de entidade de serviço para Synapse:

; Defining the Service Principal credentials for the Azure storage account
fs.azure.account.auth.type OAuth
fs.azure.account.oauth.provider.type org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
fs.azure.account.oauth2.client.id <application-id>
fs.azure.account.oauth2.client.secret <service-credential>
fs.azure.account.oauth2.client.endpoint https://login.microsoftonline.com/<directory-id>/oauth2/token

; Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.databricks.sqldw.jdbc.service.principal.client.id <application-id>
spark.databricks.sqldw.jdbc.service.principal.client.secret <service-credential>
// Defining the Service Principal credentials for the Azure storage account
spark.conf.set("fs.azure.account.auth.type", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret", "<service-credential>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

// Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")
# Defining the service principal credentials for the Azure storage account
spark.conf.set("fs.azure.account.auth.type", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret", "<service-credential>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

# Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
spark.conf.set("spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")
# Load SparkR
library(SparkR)
conf <- sparkR.callJMethod(sparkR.session(), "conf")

# Defining the service principal credentials for the Azure storage account
sparkR.callJMethod(conf, "set", "fs.azure.account.auth.type", "OAuth")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth.provider.type",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.id", "<application-id>")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.secret", "<service-credential>")
sparkR.callJMethod(conf, "set", "fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

# Defining a separate set of service principal credentials for Azure Synapse Analytics (If not defined, the connector will use the Azure storage account credentials)
sparkR.callJMethod(conf, "set", "spark.databricks.sqldw.jdbc.service.principal.client.id", "<application-id>")
sparkR.callJMethod(conf, "set", "spark.databricks.sqldw.jdbc.service.principal.client.secret", "<service-credential>")

Modos de salvamento suportados para gravações de lotes

O conector Azure Synapse dá suporte aos modos de salvamento ErrorIfExists, Ignore, Append e Overwrite, sendo o modo default ErrorIfExists. Para obter mais informações sobre os modos de salvamento suportados no Apache Spark, consulte a documentação do Spark SQL em Save Modes.

Referência de opções do conector Databricks Synapse

O OPTIONS fornecido no Spark SQL oferece suporte às seguintes configurações:

Parâmetro

Obrigatório

Padrão

Notas

dbTable

Sim, a menos que query seja especificado

Nenhum default

A tabela a ser criada ou lida no Azure Synapse. Este parâmetro é necessário ao salvar dados no Azure Synapse.

Você também pode usar {SCHEMA NAME}.{TABLE NAME} para acessar uma tabela em um determinado esquema. Se o nome do esquema não for fornecido, o esquema default associado ao usuário JDBC será usado.

A variante dbtable suportada anteriormente está obsoleta e será ignorada em versões futuras. Use o nome “caixa de camelo”.

query

Sim, a menos que dbTable seja especificado

Nenhum default

A query para leitura no Azure Synapse.

Para tabelas referidas na query, você também pode usar {SCHEMA NAME}.{TABLE NAME} para acessar uma tabela em um determinado esquema. Se o nome do esquema não for fornecido, o esquema default associado ao usuário JDBC será usado.

user

Não

Nenhum default

O nome de usuário do Azure Synapse. Deve ser usado em conjunto com a opção password . Só pode ser utilizado se o usuário e senha não forem passados na URL. Passar em ambos resultará em erro.

password

Não

Nenhum default

A senha do Azure Synapse. Deve ser usado em conjunto com a opção user . Só pode ser utilizado se o usuário e senha não forem passados na URL. Passar em ambos resultará em erro.

url

Sim

Nenhum default

Um URL JDBC com sqlserver definido como subprotocolo. Recomenda-se utilizar as strings de ligação fornecidas pelo portal Azure. A configuração encrypt=true é altamente recomendada porque ativa a criptografia SSL da conexão JDBC. Se user e password forem definidos separadamente, não será necessário incluí-los na URL.

jdbcDriver

Não

Determinado pelo subprotocolo do URL JDBC

O nome da classe do driver JDBC a ser usado. Esta classe deve estar no classpath. Na maioria dos casos, não será necessário especificar esta opção, pois o nome de classe do driver apropriado deverá ser determinado automaticamente pelo subprotocolo da URL JDBC.

A variante jdbc_driver suportada anteriormente está obsoleta e será ignorada em versões futuras. Use o nome “caixa de camelo”.

tempDir

Sim

Nenhum default

Um URI abfss . Recomendamos que utilize um contentor de armazenamento Blob dedicado para o Azure Synapse.

A variante tempdir suportada anteriormente está obsoleta e será ignorada em versões futuras. Use o nome “caixa de camelo”.

O senhor não pode usar um local externo definido no Unity Catalog como um local tempDir.

tempCompression

Não

SNAPPY

O algoritmo de compactação a ser usado para codificar/decodificar temporariamente pelo Spark e pelo Azure Synapse. Os valores atualmente suportados são: UNCOMPRESSED, SNAPPY e GZIP.

forwardSparkAzureStorageCredentials

Não

falso

Se true, a biblioteca descobrirá automaticamente as credenciais de acesso ao armazenamento account key que o Spark está usando para se conectar ao contêiner de armazenamento Blob e encaminhará essas credenciais ao Azure Synapse por JDBC. Essas credenciais são enviadas como parte da consulta JDBC. Portanto, é altamente recomendável que o senhor ative a criptografia SSL da conexão JDBC ao usar essa opção.

Ao configurar a autenticação do armazenamento, o senhor deve definir exatamente um dos valores useAzureMSI e forwardSparkAzureStorageCredentials como true. Como alternativa, o senhor pode definir enableServicePrincipalAuth como true e usar a entidade de serviço para autenticação de JDBC e de armazenamento. A opção forwardSparkAzureStorageCredentials não oferece suporte à autenticação no armazenamento usando uma identidade de serviço gerenciado ou uma entidade de serviço. Somente o armazenamento account access key é suportado.

A variante forward_spark_azure_storage_credentials suportada anteriormente está obsoleta e será ignorada em versões futuras. Use o nome “caixa de camelo”.

useAzureMSI

Não

falso

Se true, a biblioteca especificará IDENTITY = 'Managed Service Identity' e não SECRET para as credenciais com escopo de banco de dados que ela cria.

Ao configurar a autenticação de armazenamento, você deve definir exatamente um entre useAzureMSI e forwardSparkAzureStorageCredentials como true. Como alternativa, você pode definir enableServicePrincipalAuth como true e usar a entidade de serviço para JDBC e autenticação de armazenamento.

enableServicePrincipalAuth

Não

falso

Se true, a biblioteca usará as credenciais de entidade de serviço fornecidas para se conectar à account de armazenamento do Azure e ao Azure Synapse Analytics por meio de JDBC.

Se forward_spark_azure_storage_credentials ou useAzureMSI estiver definido como true, essa opção terá precedência sobre a entidade de serviço na autenticação de armazenamento.

tableOptions

Não

CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN

Uma strings usada para especificar opções de tabela ao criar a tabela do Azure Synapse definida por meio de dbTable. Essas strings são passadas literalmente para a cláusula WITH da instrução SQL CREATE TABLE emitida no Azure Synapse.

A variante table_options suportada anteriormente está obsoleta e será ignorada em versões futuras. Use o nome “caixa de camelo”.

preActions

Não

Nenhum default ( strings vazias)

Uma lista separada ; de comandos SQL a serem executados no Azure Synapse antes de gravar dados na instância do Azure Synapse. Estes comandos SQL devem ser comandos válidos aceitos pelo Azure Synapse.

Se algum destes comandos falhar, é tratado como um erro e as operações de escrita não são executadas.

postActions

Não

Nenhum default ( strings vazias)

Uma lista separada ; de comandos SQL a serem executados no Azure Synapse depois que o conector grava dados com êxito na instância do Azure Synapse. Estes comandos SQL devem ser comandos válidos aceitos pelo Azure Synapse.

Se algum destes comandos falhar, será tratado como um erro e receberá uma exceção depois de os dados serem escritos com sucesso na instância do Azure Synapse.

maxStrLength

Não

256

StringType no Spark é mapeado para o tipo NVARCHAR(maxStrLength) no Azure Synapse. Você pode usar maxStrLength para definir o comprimento das strings para todas as colunas do tipo NVARCHAR(maxStrLength) que estão na tabela com o nome dbTable no Azure Synapse.

A variante maxstrlength suportada anteriormente está obsoleta e será ignorada em versões futuras. Use o nome “caixa de camelo”.

applicationName

Não

Databricks-User-Query

As tags da conexão para cada query. Se não for especificado ou o valor for uma strings vazia, o valor default das tags será adicionado ao URL JDBC. O valor default impede que a ferramenta de monitoramento do banco de dados do Azure gere alertas falsos de injeção de SQL contra query.

maxbinlength

Não

Nenhum default

Controle o comprimento da coluna de BinaryType colunas. Este parâmetro é traduzido como VARBINARY(maxbinlength).

identityInsert

Não

falso

Definir como true habilita o modo IDENTITY_INSERT , que insere um valor fornecido pelo DataFrame na coluna de identidade da tabela do Azure Synapse.

Consulte Inserindo valores explicitamente em uma coluna IDENTITY.

externalDataSource

Não

Nenhum default

Um pré-provisionamento fonte de dados externa para leitura de dados do Azure Synapse. Uma fonte de dados externa só pode ser usada com o PolyBase e remove o requisito de permissão CONTROL porque o conector não precisa criar uma credencial com escopo e uma fonte de dados externa para carregar dados.

Por exemplo, o uso e a lista de permissões necessárias ao usar uma fonte de dados externa, consulte Permissões necessárias do Azure Synapse para PolyBase com a opção de fonte de dados externa.

maxErrors

Não

0

O número máximo de linhas que podem ser rejeitadas durante leituras e gravações antes que as operações de carregamento sejam canceladas. As linhas rejeitadas serão ignoradas. Por exemplo, se dois em cada dez registros apresentarem erros, apenas oito registros serão processados.

Consulte a documentação REJECT_VALUE em CREATE EXTERNAL TABLE e a documentação MAXERRORS em COPY.

inferTimestampNTZType

Não

falso

Se true, os valores do tipo Azure Synapse TIMESTAMP serão interpretados como TimestampNTZType (carimbo de data/hora sem fuso horário) durante as leituras. Caso contrário, todos os carimbos de data/hora serão interpretados como TimestampType , independentemente do tipo na tabela subjacente do Azure Synapse.

Observação

  • tableOptions, preActions, postActions e maxStrLength são relevantes apenas ao gravar dados de Databricks em uma nova tabela no Azure Synapse.

  • Embora todos os nomes de opções da fonte de dados não façam distinção entre maiúsculas e minúsculas, recomendamos que você os especifique em “camel case” para maior clareza.

Empilhamento de consulta no Azure Synapse

O conector Azure Synapse implementa um conjunto de regras de otimização para empurrar os seguintes operadores para o Azure Synapse:

  • Filter

  • Project

  • Limit

Os operadores Project e Filter suportam as seguintes expressões:

  • A maioria dos operadores lógicos Boolean

  • Comparações

  • Operações aritméticas básicas

  • Conversões numéricas e strings

Para o operador Limit , o pushdown é suportado somente quando não há ordem especificada. Por exemplo:

SELECT TOP(10) * FROM table, mas não SELECT TOP(10) * FROM table ORDER BY col.

Observação

O conector Azure Synapse não envia expressões que operam em strings, datas ou carimbos de data/hora.

o pushdown query criado com o conector Azure Synapse é habilitado por default. Você pode desativá-lo definindo spark.databricks.sqldw.pushdown como false.

Gestão temporária de dados

O conector Azure Synapse não elimina os ficheiros temporários que cria no contentor de armazenamento Azure. A Databricks recomenda que você exclua periodicamente os arquivos temporários no local tempDir fornecido pelo usuário.

Para facilitar a limpeza dos dados, o conector do Azure Synapse não armazena os arquivos de dados diretamente em tempDir, mas cria um subdiretório com o formato: <tempDir>/<yyyy-MM-dd>/<HH-mm-ss-SSS>/<randomUUID>/. O senhor pode configurar um trabalho periódico (usando o recurso Databricks Job ou de outra forma) para excluir recursivamente todos os subdiretórios mais antigos do que um determinado limite (por exemplo, 2 dias), com a suposição de que não pode haver um trabalho Spark em execução por mais tempo do que esse limite.

Uma alternativa mais simples é descartar periodicamente todo o contêiner e criar um novo com o mesmo nome. Isto requer que utilize um contentor dedicado para os dados temporários produzidos pelo conector Azure Synapse e que possa encontrar uma janela de tempo na qual possa garantir que nenhuma query envolvendo o conector esteja em execução.

Gerenciamento de objetos temporários

O conector Azure Synapse automatiza a transferência de dados entre clusters Databricks e uma instância Azure Synapse. Para ler dados de uma tabela do Azure Synapse ou query ou gravar dados em uma tabela do Azure Synapse, o conector do Azure Synapse cria objetos temporários, incluindo DATABASE SCOPED CREDENTIAL, EXTERNAL DATA SOURCE, EXTERNAL FILE FORMAT e EXTERNAL TABLE nos bastidores. Esses objetos permanecem ativos apenas durante a duração do Spark Job correspondente e são descartados automaticamente.

Quando um clusters estiver executando uma query usando o conector Azure Synapse, se o processo do driver Spark falhar ou for reiniciado à força, ou se os clusters forem encerrados ou reiniciados à força, os objetos temporários poderão não ser descartados. Para facilitar a identificação e a eliminação manual destes objetos, o conector Azure Synapse prefixa os nomes de todos os objetos temporários intermédios criados na instância Azure Synapse com tags no formato: tmp_databricks_<yyyy_MM_dd_HH_mm_ss_SSS>_<randomUUID>_<internalObject>.

Recomendamos que você procure periodicamente por objetos vazados usando query como as seguintes:

  • SELECT * FROM sys.database_scoped_credentials WHERE name LIKE 'tmp_databricks_%'

  • SELECT * FROM sys.external_data_sources WHERE name LIKE 'tmp_databricks_%'

  • SELECT * FROM sys.external_file_formats WHERE name LIKE 'tmp_databricks_%'

  • SELECT * FROM sys.external_tables WHERE name LIKE 'tmp_databricks_%'