Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Importante
Esse recurso está na versão prévia.
O conector do Spark para bancos de dados SQL é uma biblioteca de alto desempenho que permite ler e gravar no SQL Server, bancos de dados SQL do Azure e bancos de dados SQL do Fabric. O conector oferece os seguintes recursos:
- Use o Spark para executar grandes operações de gravação e leitura no Banco de Dados SQL do Azure, na Instância Gerenciada de SQL do Azure, no SQL Server na VM do Azure e nos bancos de dados SQL do Fabric.
- Quando você usa uma tabela ou uma exibição, o conector dá suporte a modelos de segurança definidos no nível do mecanismo SQL. Esses modelos incluem segurança em nível de objeto (OLS), segurança em nível de linha (RLS) e segurança em nível de coluna (CLS).
O conector é pré-instalado no runtime do Fabric, portanto, você não precisa instalá-lo separadamente.
Authentication
A autenticação do Microsoft Entra é integrada ao Microsoft Fabric.
- Quando você entra no workspace do Fabric, suas credenciais são passadas automaticamente para o mecanismo SQL para autenticação e autorização.
- Exige que a ID do Microsoft Entra seja habilitada e configurada em seu mecanismo de banco de dados SQL.
- Nenhuma configuração extra será necessária no código do Spark se a ID do Microsoft Entra estiver configurada. As credenciais são mapeadas automaticamente.
Você também pode usar o método de autenticação SQL (especificando um nome de usuário e senha do SQL) ou um principal de serviço (fornecendo um token de acesso do Azure para autenticação baseada em aplicativo).
Permissions
Para usar o conector do Spark, sua identidade, seja um usuário ou um aplicativo, deve ter as permissões de banco de dados necessárias para o mecanismo SQL de destino. Essas permissões são necessárias para ler ou gravar em tabelas e exibições.
Para o Banco de Dados SQL do Azure, a Instância Gerenciada de SQL do Azure e o SQL Server na VM do Azure:
- A identidade que executa a operação normalmente precisa
db_datawriteredb_datareaderpermissões e, opcionalmentedb_owner, para controle total.
Para bancos de dados SQL do Fabric:
- A identidade normalmente precisa das permissões
db_datawriteredb_datareader, e, opcionalmente,db_owner. - A identidade também precisa de pelo menos permissão de leitura no banco de dados SQL do Fabric no nível do item.
Observação
Se você usar uma entidade de serviço (service principal), ela poderá funcionar como um aplicativo (sem contexto de usuário) ou como usuário, se a representação do usuário estiver habilitada. O principal de serviço deve ter as permissões de banco de dados necessárias para as operações que você deseja executar.
Exemplos de uso e código
Nesta seção, fornecemos exemplos de código para demonstrar como usar o conector Spark para bancos de dados SQL com eficiência. Esses exemplos abrangem vários cenários, incluindo ler e gravar em tabelas SQL e configurar as opções do conector.
Opções com suporte
A opção mínima necessária é url como "jdbc:sqlserver://<server>:<port>;database=<database>;" ou definir spark.mssql.connector.default.url.
Quando o
urlfor fornecido:- Sempre use
urlcomo primeira preferência. - Se
spark.mssql.connector.default.urlnão estiver definido, o conector o definirá e o reutilizará para uso futuro.
- Sempre use
Quando o
urlnão for fornecido:- Se
spark.mssql.connector.default.urlestiver definido, o conector usará o valor da configuração do spark. - Se
spark.mssql.connector.default.urlnão estiver definido, um erro será gerado porque os detalhes necessários não estão disponíveis.
- Se
Esse conector dá suporte às opções definidas aqui: Opções JDBC do SQL DataSource
O conector também dá suporte às seguintes opções:
| Opção | Valor padrão | Description |
|---|---|---|
reliabilityLevel |
"MELHOR_ESFORÇO" | Controla a confiabilidade das operações de inserção. Valores possíveis: BEST_EFFORT (padrão, mais rápido, pode resultar em linhas duplicadas se um executor for reiniciado), NO_DUPLICATES (mais lento, garante que nenhuma linha duplicada seja inserida mesmo se um executor for reiniciado). Escolha com base em sua tolerância para duplicatas e necessidades de desempenho. |
isolationLevel |
"READ_COMMITTED" | Define o nível de isolamento da transação para operações SQL. Valores possíveis: READ_COMMITTED (padrão, impede a leitura de dados não confirmados), READ_UNCOMMITTED, , REPEATABLE_READ, SNAPSHOT. SERIALIZABLE Níveis de isolamento mais altos podem reduzir a simultaneidade, mas melhorar a consistência dos dados. |
tableLock |
falso | Controla se a dica de bloqueio no nível da tabela TABLOCK do SQL Server é usada durante as operações de inserção. Valores possíveis: true (habilita TABLOCK, que pode melhorar o desempenho de gravação em massa), false (padrão, não usa TABLOCK). Definir para true pode aumentar a taxa de transferência para inserções grandes, mas pode reduzir a concorrência para outras operações na tabela. |
schemaCheckEnabled |
"verdadeiro" | Controla se a validação estrita de esquema é imposta entre o Spark DataFrame e a tabela SQL. Valores possíveis: true (padrão, impõe correspondência estrita de esquema) false (permite mais flexibilidade e pode ignorar algumas verificações de esquema). Definir para false pode ajudar nas incompatibilidades de esquema, mas pode levar a resultados inesperados caso as estruturas sejam significativamente diferentes. |
Outras opções de API em massa podem ser configuradas e DataFrame são passadas para as APIs de cópia em massa durante a gravação.
Exemplo de gravação e leitura
O código a seguir mostra como gravar e ler dados usando o mssql("<schema>.<table>") método com autenticação automática da ID do Microsoft Entra.
Dica
Os dados são criados in-line para fins de demonstração. Em um cenário de produção, você normalmente leria dados de uma fonte existente ou criaria algo mais complexo DataFrame.
import com.microsoft.sqlserver.jdbc.spark
url = "jdbc:sqlserver://<server>:<port>;database=<database>;"
row_data = [("Alice", 1),("Bob", 2),("Charlie", 3)]
column_header = ["Name", "Age"]
df = spark.createDataFrame(row_data, column_header)
df.write.mode("overwrite").option("url", url).mssql("dbo.publicExample")
spark.read.option("url", url).mssql("dbo.publicExample").show()
url = "jdbc:sqlserver://<server>:<port>;database=<database2>;" # different database
df.write.mode("overwrite").option("url", url).mssql("dbo.tableInDatabase2") # default url is updated
spark.read.mssql("dbo.tableInDatabase2").show() # no url option specified and will use database2
Você também pode selecionar colunas, aplicar filtros e usar outras opções ao ler dados do mecanismo de banco de dados SQL.
Exemplos de autenticação
Os exemplos a seguir mostram como usar métodos de autenticação além do Microsoft Entra ID, como service principal (token de acesso) e a autenticação SQL.
Observação
Conforme mencionado anteriormente, a autenticação de ID do Microsoft Entra é tratada automaticamente quando você faz login na área de trabalho do Fabric. Portanto, você só precisa usar esses métodos se o cenário exigir.
import com.microsoft.sqlserver.jdbc.spark
url = "jdbc:sqlserver://<server>:<port>;database=<database>;"
row_data = [("Alice", 1),("Bob", 2),("Charlie", 3)]
column_header = ["Name", "Age"]
df = spark.createDataFrame(row_data, column_header)
from azure.identity import ClientSecretCredential
credential = ClientSecretCredential(tenant_id="", client_id="", client_secret="") # service principal app
scope = "https://database.windows.net/.default"
token = credential.get_token(scope).token
df.write.mode("overwrite").option("url", url).option("accesstoken", token).mssql("dbo.publicExample")
spark.read.option("accesstoken", token).mssql("dbo.publicExample").show()
Modos de salvamento de DataFrame com suporte
Ao gravar dados do Spark em bancos de dados SQL, você pode escolher entre vários modos de salvamento. Os modos de salvamento controlam como os dados são gravados quando a tabela de destino já existe e podem afetar o esquema, os dados e a indexação. Entender esses modos ajuda você a evitar perdas ou alterações inesperadas de dados.
Esse conector dá suporte às opções definidas aqui: Funções de salvamento do Spark
ErrorIfExists (modo de salvamento padrão): se a tabela de destino existir, a gravação será anulada e uma exceção será retornada. Caso contrário, uma nova tabela será criada com dados.
Ignorar: se a tabela de destino existir, a gravação ignorará a solicitação e não retornará um erro. Caso contrário, uma nova tabela será criada com dados.
Substituir: Caso a tabela de destino já exista, ela será descartada, recriada e novos dados serão adicionados.
Observação
Quando você usa
overwrite, o esquema de tabela original (especialmente tipos de dados exclusivos do MSSQL) e os índices de tabela são perdidos e substituídos pelo esquema inferido do DataFrame do Spark. Para evitar a perda de esquema e índices, use.option("truncate", true)em vez deoverwrite.Acrescentar: se a tabela de destino existir, novos dados serão acrescentados a ela. Caso contrário, uma nova tabela será criada com dados.
Troubleshoot
Quando o processo é concluído, a saída da operação de leitura do Spark é exibida na área de saída da célula. Erros de com.microsoft.sqlserver.jdbc.SQLServerException vêm diretamente do SQL Server. Você pode encontrar informações detalhadas de erro nos logs de aplicativos do Spark.