Dados de consulta no Azure Synapse Analytics

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

Nota

Você pode preferir Lakehouse Federation para gerenciar consultas no Azure Synapse ou dados do Azure Data Warehouse. Veja O que é Lakehouse Federation.

O Azure Synapse Analytics é um armazém de dados empresarial baseado na nuvem que tira partido do processamento paralelo maciço (MPP) para executar rapidamente consultas complexas em petabytes de dados.

Importante

Este conector é para uso apenas com instâncias do Pool Dedicado Synapse e não é compatível com outros componentes do Synapse.

Nota

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

Sintaxe de exemplo para Sinapse

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

Nota

Use a cadeia de conexão fornecida pelo portal do Azure, que habilita a criptografia SSL (Secure Sockets Layer) para todos os dados enviados entre o driver do Spark e a instância do Azure Synapse por meio da conexão JDBC. Para verificar se a criptografia SSL está habilitada, você pode procurar na cadeia de encrypt=true conexão.

Importante

Os locais externos definidos no Catálogo Unity não são suportados como tempDir locais.

Scala


// 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()

Python


# 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()

SQL


-- 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;

R

# 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 o Azure Databricks e o Synapse?

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

  • Controlador do Apache Spark para Azure Synapse
  • Cluster Spark para conta de armazenamento do Azure
  • Azure Synapse para a conta de armazenamento do Azure

Configurando o acesso ao armazenamento do Azure

Tanto o Azure Databricks quanto o Synapse precisam de acesso privilegiado a uma conta de armazenamento do Azure para serem usados para armazenamento temporário de dados.

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

Permissões necessárias do Azure Synapse

Como ele usa COPY em segundo plano, o conector do Azure Synapse requer que o usuário da conexão JDBC tenha permissão para executar os seguintes comandos na instância conectada do Azure Synapse:

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

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

Permissões (inserir numa tabela existente) Permissões (inserir numa tabela nova)
ADMINISTRAR OPERAÇÕES EM MASSA NA BASE DE DADOS

INSERT
ADMINISTRAR OPERAÇÕES EM MASSA NA BASE DE DADOS

INSERT

CREATE TABLE

ALTERAR NO ESQUEMA :: dbo

Configurações de rede

Se você configurar um firewall no Azure Synapse, deverá definir as configurações de rede para permitir que o Azure Databricks alcance o Azure Synapse. Primeiro, certifique-se de que seu espaço de trabalho do Azure Databricks seja implantado em sua própria rede virtual após Implantar o Azure Databricks em sua rede virtual do Azure (injeção de VNet). Em seguida, você pode configurar regras de firewall IP no Azure Synpase para permitir conexões de suas sub-redes com sua conta Synapse. Consulte Regras de firewall IP do Azure Synapse Analytics.

Configurar a conexão do Azure Databricks para 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 à conta de armazenamento subjacente. Para obter mais informações sobre como usar credenciais da entidade de serviço para acessar uma conta de armazenamento do Azure, consulte Conectar-se ao Azure Data Lake Storage Gen2 e Blob Storage. Você deve definir a enableServicePrincipalAuth opção como true na configuração de conexão Azure Databricks Synapse connector options reference para permitir que o conector se autentique 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 as credenciais da entidade de serviço para a conta de armazenamento e as credenciais opcionais da entidade de serviço para Synapse:

ini

; 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>

Scala

// 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>")

Python

# 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>")

R

# 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 em lote

O conector Sinapse do Azure suporta ErrorIfExistsos modos , , IgnoreAppende Overwrite salvar com o modo padrão sendo ErrorIfExists. Para obter mais informações sobre os modos de salvamento suportados no Apache Spark, consulte a documentação do Spark SQL em Modos de salvamento.

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

O OPTIONS fornecido no Spark SQL suporta as seguintes configurações:

Parâmetro Necessário Predefinição Notas
dbTable Sim, a menos que query seja especificado Sem padrão A tabela a partir da qual criar ou ler no Azure Synapse. Esse parâmetro é necessário ao salvar dados de volta 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 padrão associado ao usuário JDBC será usado.

A variante suportada anteriormente foi preterida e será ignorada dbtable em versões futuras. Em vez disso, use o nome "camel case".
query Sim, a menos que dbTable seja especificado Sem padrão A consulta a partir da qual ler no Azure Synapse.

Para tabelas referidas na consulta, 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 padrão associado ao usuário JDBC será usado.
user Não Sem padrão O nome de usuário do Azure Synapse. Deve ser usado em conjunto com password a opção. Só pode ser usado se o usuário e a senha não forem passados na URL. A aprovação de ambos resultará em um erro.
password Não Sem padrão A senha do Azure Synapse. Deve ser usado em conjunto com user a opção. Só pode ser usado se o usuário e a senha não forem passados na URL. A aprovação de ambos resultará em um erro.
url Sim Sem padrão UM URL JDBC com sqlserver definido como o subprotocolo. É recomendável usar a cadeia de conexão fornecida pelo portal do Azure. Definição
encrypt=true é altamente recomendado, pois permite a criptografia SSL da conexão JDBC. Se user e password forem definidos separadamente, não é necessário incluí-los no URL.
jdbcDriver Não Determinado pelo subprotocolo da URL JDBC O nome da classe do driver JDBC a ser usado. Essa classe deve estar no classpath. Na maioria dos casos, não deve ser necessário especificar essa opção, pois o nome de classe do driver apropriado deve ser determinado automaticamente pelo subprotocolo da URL JDBC.

A variante suportada anteriormente foi preterida e será ignorada jdbc_driver em versões futuras. Em vez disso, use o nome "camel case".
tempDir Sim Sem padrão Um abfss URI. Recomendamos que você use um contêiner de armazenamento de Blob dedicado para o Azure Synapse.

A variante suportada anteriormente foi preterida e será ignorada tempdir em versões futuras. Em vez disso, use o nome "camel case".

Não é possível usar um local externo definido no Catálogo Unity como um tempDir local.
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 false Se trueo , a biblioteca descobrir automaticamente as credenciais da chave de acesso da conta de armazenamento que o Spark está usando para se conectar ao contêiner de armazenamento de Blob e encaminhará essas credenciais para o Azure Synapse por JDBC. Essas credenciais são enviadas como parte da consulta JDBC. Portanto, é altamente recomendável que você habilite a criptografia SSL da conexão JDBC ao usar essa opção.

Ao configurar a autenticação de armazenamento, você deve definir exatamente um de useAzureMSI e forwardSparkAzureStorageCredentials para true. Como alternativa, você pode definir enableServicePrincipalAuth e usar a true entidade de serviço para autenticação JDBC e de armazenamento. A forwardSparkAzureStorageCredentials opção não oferece suporte à autenticação para armazenamento usando uma identidade de serviço gerenciado ou uma entidade de serviço. Apenas a chave de acesso da conta de armazenamento é suportada.

A variante suportada anteriormente foi preterida e será ignorada forward_spark_azure_storage_credentials em versões futuras. Em vez disso, use o nome "camel case".
useAzureMSI Não false Se true, a biblioteca especificará IDENTITY = 'Managed Service Identity' e não SECRET para as credenciais de escopo do banco de dados que cria.

Ao configurar a autenticação de armazenamento, você deve definir exatamente um de useAzureMSI e forwardSparkAzureStorageCredentials para true. Como alternativa, você pode definir enableServicePrincipalAuth e usar a true entidade de serviço para autenticação JDBC e de armazenamento.
enableServicePrincipalAuth Não false Se true, a biblioteca usará as credenciais da entidade de serviço fornecida para se conectar à conta de armazenamento do Azure e ao Azure Synapse Analytics por JDBC.

Se uma ou forward_spark_azure_storage_credentialsuseAzureMSI estiver definida 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 cadeia de caracteres usada para especificar opções de tabela ao criar a tabela do Azure Synapse definida através do dbTable. Essa cadeia de caracteres é passada literalmente para a WITH cláusula da instrução SQL emitida contra o CREATE TABLE Azure Synapse.

A variante suportada anteriormente foi preterida e será ignorada table_options em versões futuras. Em vez disso, use o nome "camel case".
preActions Não Sem padrão (string vazia) Uma ; lista separada de comandos SQL a serem executados no Azure Synapse antes de gravar dados na instância do Azure Synapse. Esses comandos SQL são necessários para serem comandos válidos aceitos pelo Azure Synapse.

Se algum desses comandos falhar, ele será tratado como um erro e a operação de gravação não será executada.
postActions Não Sem padrão (string vazia) 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. Esses comandos SQL são necessários para serem comandos válidos aceitos pelo Azure Synapse.

Se qualquer um desses comandos falhar, ele será tratado como um erro e você obterá uma exceção depois que os dados forem gravados com êxito na instância do Azure Synapse.
maxStrLength Não 256 StringType no Spark é mapeado para o NVARCHAR(maxStrLength) tipo no Azure Synapse. Você pode usar maxStrLength para definir o comprimento da cadeia de caracteres para todas as NVARCHAR(maxStrLength) colunas de tipo que estão na tabela com nome
dbTable no Azure Synapse.

A variante suportada anteriormente foi preterida e será ignorada maxstrlength em versões futuras. Em vez disso, use o nome "camel case".
applicationName Não Databricks-User-Query A tag da conexão para cada consulta. Se não for especificado ou se o valor for uma cadeia de caracteres vazia, o valor padrão da tag será adicionado à URL JDBC. O valor padrão impede que a ferramenta de Monitoramento do Banco de Dados do Azure gere alertas de injeção de SQL espúrios contra consultas.
maxbinlength Não Sem padrão Controle o comprimento das BinaryType colunas. Este parâmetro é traduzido como VARBINARY(maxbinlength).
identityInsert Não false Configuração para habilita IDENTITY_INSERT o true modo, que insere um valor fornecido pelo DataFrame na coluna de identidade da tabela Sinapse do Azure.

Consulte Inserção explícita de valores em uma coluna IDENTIDADE.
externalDataSource Não Sem padrão Uma fonte de dados externa pré-provisionada para ler 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 o 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 a operação de carregamento seja cancelada. As linhas rejeitadas serão ignoradas. Por exemplo, se dois em cada dez registos tiverem erros, apenas oito registos serão processados.

Consulte REJECT_VALUE documentação em CREATE EXTERNAL TABLE e MAXERRORS em COPY.
inferTimestampNTZType Não false Se true, os valores do tipo Azure Synapse TIMESTAMP forem 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.

Nota

  • tableOptions, , preActionspostActions, e maxStrLength são relevantes somente ao gravar dados do Azure Databricks em uma nova tabela no Azure Synapse.
  • Embora todos os nomes de opções de fonte de dados não diferenciem maiúsculas de minúsculas, recomendamos que você os especifique em "camel case" para maior clareza.

Pushdown de consulta no Azure Synapse

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

  • Filter
  • Project
  • Limit

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

  • A maioria dos operadores lógicos booleanos
  • Comparações
  • Operações aritméticas básicas
  • Moldes numéricos e de cordas

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

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

Nota

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

O pushdown de consulta criado com o conector Synapse do Azure é habilitado por padrão. Você pode desativá-lo definindo spark.databricks.sqldw.pushdown como false.

Gestão temporária de dados

O conector Synapse do Azure não exclui os arquivos temporários que ele cria no contêiner de armazenamento do Azure. O Databricks recomenda que você exclua periodicamente arquivos temporários no local fornecido pelo tempDir usuário.

Para facilitar a limpeza de dados, o conector Synapse do Azure não armazena arquivos de dados diretamente no tempDir, mas cria um subdiretório do formulário: <tempDir>/<yyyy-MM-dd>/<HH-mm-ss-SSS>/<randomUUID>/. Você pode configurar trabalhos periódicos (usando o recurso de trabalhos do Azure Databricks ou de outra forma) para excluir recursivamente quaisquer subdiretórios mais antigos do que um determinado limite (por exemplo, 2 dias), com a suposição de que não pode haver trabalhos do Spark executando mais do que esse limite.

Uma alternativa mais simples é deixar cair periodicamente todo o recipiente e criar um novo com o mesmo nome. Isso requer que você use um contêiner dedicado para os dados temporários produzidos pelo conector Synapse do Azure e que possa encontrar uma janela de tempo na qual você possa garantir que nenhuma consulta envolvendo o conector esteja em execução.

Gerenciamento temporário de objetos

O conector do Azure Synapse automatiza a transferência de dados entre um cluster do Azure Databricks e uma instância do Azure Synapse. Para ler dados de uma tabela do Azure Synapse ou consultar ou gravar dados em uma tabela do Azure Synapse, o conector do Azure Synapse cria objetos temporários, incluindo DATABASE SCOPED CREDENTIAL, , EXTERNAL DATA SOURCEEXTERNAL FILE FORMATe EXTERNAL TABLE nos bastidores. Esses objetos vivem apenas durante toda a duração do trabalho Spark correspondente e são automaticamente descartados.

Quando um cluster está executando uma consulta usando o conector Sinapse do Azure, se o processo do driver do Spark falhar ou for reiniciado à força, ou se o cluster for encerrado ou reiniciado à força, os objetos temporários poderão não ser descartados. Para facilitar a identificação e a exclusão manual desses objetos, o conector do Azure Synapse prefixa os nomes de todos os objetos temporários intermediários criados na instância do Azure Synapse com uma marca do formulário: tmp_databricks_<yyyy_MM_dd_HH_mm_ss_SSS>_<randomUUID>_<internalObject>.

Recomendamos que você procure periodicamente objetos vazados usando consultas 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_%'