Eseguire query sui dati in Azure Synapse Analytics
È possibile accedere ad Azure Synapse da Azure Databricks usando il connettore Azure Synapse, che usa l'istruzione COPY
in Azure Synapse per trasferire in modo efficiente grandi volumi di dati tra un cluster Azure Databricks e un'istanza di Azure Synapse usando un account di archiviazione di Azure Data Lake Storage Gen2 per la gestione temporanea.
Importante
Le configurazioni descritte in questo articolo sono Sperimentale. Le funzionalità sperimentali vengono fornite così come sono e non sono supportate da Databricks tramite il supporto tecnico del cliente. Per ottenere il supporto completo della federazione delle query, è consigliabile usare invece Lakehouse Federation, che consente agli utenti di Azure Databricks di sfruttare la sintassi di Unity Catalog e gli strumenti di governance dei dati.
Azure Synapse Analytics è un data warehouse aziendale basato sul cloud che sfrutta l'elaborazione parallela elevata (MPP) per eseguire rapidamente query complesse in petabyte di dati.
Importante
Questo connettore è destinato all'uso solo con le istanze del pool dedicato di Synapse e non è compatibile con altri componenti di Synapse.
Nota
COPY
è disponibile solo nelle istanze di Azure Data Lake Storage Gen2. Per informazioni dettagliate sull'uso di Polybase, vedere Connessione di Azure Databricks e Azure Synapse con PolyBase (legacy).
Sintassi di esempio per Synapse
È possibile eseguire query su Synapse in Scala, Python, SQL e R. Gli esempi di codice seguenti usano le chiavi dell'account di archiviazione e inoltrano le credenziali di archiviazione da Azure Databricks a Synapse.
Nota
Usare la stringa di connessione fornita da portale di Azure, che abilita la crittografia SSL (Secure Sockets Layer) per tutti i dati inviati tra il driver Spark e l'istanza di Azure Synapse tramite la connessione JDBC. Per verificare che la crittografia SSL sia abilitata, è possibile cercare encrypt=true
nella stringa di connessione.
Importante
Le posizioni esterne definite nel catalogo unity non sono supportate come tempDir
posizioni.
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>")
Come funziona l'autenticazione tra Azure Databricks e Synapse?
Il connettore di Azure Synapse usa tre tipi di connessioni di rete:
- Driver di Spark per Azure Synapse
- Cluster Spark nell'account di archiviazione di Azure
- Azure Synapse per l'account di archiviazione di Azure
Configurazione dell'accesso ad Archiviazione di Azure
Sia Azure Databricks che Synapse necessitano dell'accesso con privilegi a un account di archiviazione di Azure da usare per l'archiviazione temporanea dei dati.
Azure Synapse non supporta l'uso della firma di accesso condiviso per l'accesso all'account di archiviazione. È possibile configurare l'accesso per entrambi i servizi eseguendo una delle operazioni seguenti:
- Usare la chiave dell'account e il segreto per l'account di archiviazione e impostare su
forwardSparkAzureStorageCredentials
true
. Vedere Impostare le proprietà di Spark per configurare le credenziali di Azure per accedere ad Archiviazione di Azure. - Usare Azure Data Lake Storage Gen2 con l'autenticazione OAuth 2.0 e impostare su
enableServicePrincipalAuth
true
. Vedere Configurare la connessione da Azure Databricks a Synapse con OAuth 2.0 con un'entità servizio. - Configurare l'istanza di Azure Synapse per avere un'identità del servizio gestita e impostare su
useAzureMSI
true
.
Autorizzazioni necessarie per Azure Synapse
Poiché usa COPY
in background, il connettore Azure Synapse richiede che l'utente della connessione JDBC disponga dell'autorizzazione per eseguire i comandi seguenti nell'istanza di Azure Synapse connessa:
Se la tabella di destinazione non esiste in Azure Synapse, è necessaria l'autorizzazione per eseguire il comando seguente oltre al comando precedente:
La tabella seguente riepiloga le autorizzazioni necessarie per le scritture con COPY
:
Autorizzazioni (inserimento in una tabella esistente) | Autorizzazioni (inserimento in una nuova tabella) |
---|---|
ADMINISTER DATABASE BULK OPERATIONS INSERT |
ADMINISTER DATABASE BULK OPERATIONS INSERT CREA TABELLA ALTER ON SCHEMA:: dbo |
Configurazioni di rete
Se si configura un firewall in Azure Synapse, è necessario configurare le impostazioni di rete per consentire ad Azure Databricks di raggiungere Azure Synapse. Assicurarsi prima di tutto che l'area di lavoro di Azure Databricks sia distribuita nella propria rete virtuale seguendo Distribuire Azure Databricks nella rete virtuale di Azure (inserimento rete virtuale). È quindi possibile configurare le regole del firewall IP in Azure Synpase per consentire le connessioni dalle subnet all'account Synapse. Vedere Regole del firewall IP di Azure Synapse Analytics.
Configurare la connessione da Azure Databricks a Synapse con OAuth 2.0 con un'entità servizio
È possibile eseguire l'autenticazione in Azure Synapse Analytics usando un'entità servizio con accesso all'account di archiviazione sottostante. Per ulteriori informazioni sull’uso delle credenziali dell’entità servizio per accedere a un account di archiviazione Azure, vedere Connessione a Azure Data Lake Storage Gen2 e archiviazione BLOB. È necessario impostare l'opzione su true
nella configurazione della connessione Riferimento alle opzioni del connettore Azure Databricks Synapse per consentire al connettore di eseguire l'autenticazione enableServicePrincipalAuth
con un'entità servizio.
Facoltativamente, è possibile usare un'entità servizio diversa per la connessione ad Azure Synapse Analytics. L'esempio seguente configura le credenziali dell'entità servizio per l'account di archiviazione e le credenziali facoltative dell'entità servizio per 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>")
Modalità di salvataggio supportate per le scritture batch
Il connettore Azure Synapse supporta le ErrorIfExists
modalità di salvataggio , Ignore
Append
, e Overwrite
con la modalità predefinita .ErrorIfExists
Per altre informazioni sulle modalità di salvataggio supportate in Apache Spark, vedere la documentazione di Spark SQL sulle modalità di salvataggio.
Informazioni di riferimento sulle opzioni del connettore di Azure Databricks Synapse
L'oggetto OPTIONS
fornito in Spark SQL supporta le impostazioni seguenti:
Parametro | Richiesto | Valore predefinito | Note |
---|---|---|---|
dbTable |
Sì, a meno che non query venga specificato |
Nessun valore predefinito | Tabella da cui creare o leggere in Azure Synapse. Questo parametro è obbligatorio quando si salvano i dati in Azure Synapse. È anche possibile usare {SCHEMA NAME}.{TABLE NAME} per accedere a una tabella in uno schema specifico. Se non viene specificato il nome dello schema, viene usato lo schema predefinito associato all'utente JDBC.La variante supportata dbtable in precedenza è deprecata e verrà ignorata nelle versioni future. Usare invece il nome "camel case". |
query |
Sì, a meno che non dbTable venga specificato |
Nessun valore predefinito | Query da cui leggere in Azure Synapse. Per le tabelle a cui fa riferimento la query, è anche possibile usare {SCHEMA NAME}.{TABLE NAME} per accedere a una tabella in uno schema specifico. Se non viene specificato il nome dello schema, viene usato lo schema predefinito associato all'utente JDBC. |
user |
No | Nessun valore predefinito | Nome utente di Azure Synapse. Deve essere utilizzato in combinazione con password l'opzione . Può essere usato solo se l'utente e la password non vengono passati nell'URL. Il passaggio di entrambi genererà un errore. |
password |
No | Nessun valore predefinito | Password di Azure Synapse. Deve essere utilizzato in combinazione con user l'opzione . Può essere usato solo se l'utente e la password non vengono passati nell'URL. Il passaggio di entrambi genererà un errore. |
url |
Sì | Nessun valore predefinito | URL JDBC con sqlserver impostato come sottoprotocolo. È consigliabile usare il stringa di connessione fornito da portale di Azure. Impostazioneencrypt=true è fortemente consigliato, perché abilita la crittografia SSL della connessione JDBC. Se user e password vengono impostati separatamente, non è necessario includerli nell'URL. |
jdbcDriver |
No | Determinato dal sottoprotocolo dell'URL JDBC | Nome della classe del driver JDBC da usare. Questa classe deve trovarsi nel classpath. Nella maggior parte dei casi, non deve essere necessario specificare questa opzione, perché il nome di classe del driver appropriato deve essere determinato automaticamente dal sottoprotocolo dell'URL JDBC. La variante supportata jdbc_driver in precedenza è deprecata e verrà ignorata nelle versioni future. Usare invece il nome "camel case". |
tempDir |
Sì | Nessun valore predefinito | A abfss URI. È consigliabile usare un contenitore di archiviazione BLOB dedicato per Azure Synapse.La variante supportata tempdir in precedenza è deprecata e verrà ignorata nelle versioni future. Usare invece il nome "camel case".Non è possibile usare un percorso esterno definito in Unity Catalog come tempDir posizione. |
tempCompression |
No | SNAPPY |
Algoritmo di compressione da usare per codificare/decodificare temporaneo sia Spark che Azure Synapse. I valori attualmente supportati sono: UNCOMPRESSED e GZIP SNAPPY . |
forwardSparkAzureStorageCredentials |
No | false | Se true , la libreria individua automaticamente le credenziali della chiave di accesso dell'account di archiviazione usate da Spark per connettersi al contenitore di archiviazione BLOB e inoltra tali credenziali ad Azure Synapse tramite JDBC. Queste credenziali vengono inviate come parte della query JDBC. È pertanto consigliabile abilitare la crittografia SSL della connessione JDBC quando si usa questa opzione.Quando si configura l'autenticazione di archiviazione, è necessario impostare esattamente uno di useAzureMSI e forwardSparkAzureStorageCredentials su true . In alternativa, è possibile impostare enableServicePrincipalAuth true su e usare l'entità servizio sia per L'autenticazione JDBC che per l'autenticazione di archiviazione. L'opzione forwardSparkAzureStorageCredentials non supporta l'autenticazione per l'archiviazione usando un'identità del servizio gestita o un'entità servizio. È supportata solo la chiave di accesso dell'account di archiviazione.La variante supportata forward_spark_azure_storage_credentials in precedenza è deprecata e verrà ignorata nelle versioni future. Usare invece il nome "camel case". |
useAzureMSI |
No | false | Se true , la libreria specifica IDENTITY = 'Managed Service Identity' e nessuna SECRET per le credenziali con ambito database create.Quando si configura l'autenticazione di archiviazione, è necessario impostare esattamente uno di useAzureMSI e forwardSparkAzureStorageCredentials su true . In alternativa, è possibile impostare enableServicePrincipalAuth true su e usare l'entità servizio sia per L'autenticazione JDBC che per l'autenticazione di archiviazione. |
enableServicePrincipalAuth |
No | false | Se true , la libreria userà le credenziali dell'entità servizio fornite per connettersi all'account di archiviazione di Azure e ad Azure Synapse Analytics tramite JDBC.forward_spark_azure_storage_credentials Se o useAzureMSI è impostato su true , tale opzione ha la precedenza sull'entità servizio nell'autenticazione dell'archiviazione. |
tableOptions |
No | CLUSTERED COLUMNSTORE INDEX , DISTRIBUTION = ROUND_ROBIN |
Stringa usata per specificare le opzioni di tabella durante la creazione della tabella di Azure Synapse impostata tramite dbTable . Questa stringa viene passata letteralmente alla WITH clausola dell'istruzione CREATE TABLE SQL rilasciata in Azure Synapse.La variante supportata table_options in precedenza è deprecata e verrà ignorata nelle versioni future. Usare invece il nome "camel case". |
preActions |
No | Nessun valore predefinito (stringa vuota) | Elenco ; separato di comandi SQL da eseguire in Azure Synapse prima di scrivere dati nell'istanza di Azure Synapse. Questi comandi SQL devono essere comandi validi accettati da Azure Synapse.Se uno di questi comandi ha esito negativo, viene considerato come un errore e l'operazione di scrittura non viene eseguita. |
postActions |
No | Nessun valore predefinito (stringa vuota) | Elenco ; separato di comandi SQL da eseguire in Azure Synapse dopo che il connettore scrive correttamente i dati nell'istanza di Azure Synapse. Questi comandi SQL devono essere comandi validi accettati da Azure Synapse.Se uno di questi comandi ha esito negativo, viene considerato come un errore e si riceverà un'eccezione dopo che i dati vengono scritti correttamente nell'istanza di Azure Synapse. |
maxStrLength |
No | 256 | StringType In Spark viene eseguito il mapping al NVARCHAR(maxStrLength) tipo in Azure Synapse. È possibile usare maxStrLength per impostare la lunghezza della stringa per tutte le NVARCHAR(maxStrLength) colonne di tipo presenti nella tabella con nomedbTable in Azure Synapse.La variante supportata maxstrlength in precedenza è deprecata e verrà ignorata nelle versioni future. Usare invece il nome "camel case". |
applicationName |
No | Databricks-User-Query |
Tag della connessione per ogni query. Se non specificato o il valore è una stringa vuota, il valore predefinito del tag viene aggiunto all'URL JDBC. Il valore predefinito impedisce allo strumento di monitoraggio del database di Azure di generare avvisi sql injection spuri su query. |
maxbinlength |
No | Nessun valore predefinito | Controllare la lunghezza delle BinaryType colonne. Questo parametro viene convertito come VARBINARY(maxbinlength) . |
identityInsert |
No | false | L'impostazione su true abilita la IDENTITY_INSERT modalità, che inserisce un valore fornito dal dataframe nella colonna Identity della tabella di Azure Synapse.Vedere Inserimento esplicito di valori in una colonna IDENTITY. |
externalDataSource |
No | Nessun valore predefinito | Un'origine dati esterna con provisioning preliminare per leggere i dati da Azure Synapse. Un'origine dati esterna può essere usata solo con PolyBase e rimuove il requisito di autorizzazione CONTROL perché il connettore non deve creare credenziali con ambito e un'origine dati esterna per caricare i dati. Ad esempio, l'utilizzo e l'elenco delle autorizzazioni necessarie quando si usa un'origine dati esterna, vedere Autorizzazioni necessarie di Azure Synapse per PolyBase con l'opzione origine dati esterna. |
maxErrors |
No | 0 | Numero massimo di righe che possono essere rifiutate durante le operazioni di lettura e scrittura prima dell'annullamento dell'operazione di caricamento. Le righe rifiutate verranno ignorate. Ad esempio, se due record su dieci hanno errori, verranno elaborati solo otto record. Vedere REJECT_VALUE documentazione in CREATE EXTERNAL TABLE e MAXERRORS in COPY. |
inferTimestampNTZType |
No | false | Se true , i valori di tipo Azure Synapse vengono interpretati come TimestampNTZType (timestamp senza fuso orario) durante le lettureTIMESTAMP . In caso contrario, tutti i timestamp vengono interpretati come TimestampType indipendentemente dal tipo nella tabella di Azure Synapse sottostante. |
Nota
tableOptions
,preActions
,postActions
emaxStrLength
sono rilevanti solo quando si scrivono dati da Azure Databricks in una nuova tabella in Azure Synapse.- Anche se tutti i nomi delle opzioni dell'origine dati non fanno distinzione tra maiuscole e minuscole, è consigliabile specificarli in "camel case" per maggiore chiarezza.
Eseguire il push delle query in Azure Synapse
Il connettore Azure Synapse implementa un set di regole di ottimizzazione per eseguire il push degli operatori seguenti in Azure Synapse:
Filter
Project
Limit
Gli Project
operatori e Filter
supportano le espressioni seguenti:
- La maggior parte degli operatori logici booleani
- Confronti
- Operazioni aritmetiche di base
- Cast numerici e stringa
Per l'operatore Limit
, il pushdown è supportato solo quando non è specificato alcun ordinamento. Ad esempio:
SELECT TOP(10) * FROM table
, ma non SELECT TOP(10) * FROM table ORDER BY col
.
Nota
Il connettore Azure Synapse non esegue il push delle espressioni che operano su stringhe, date o timestamp.
Il pushdown delle query compilato con il connettore Azure Synapse è abilitato per impostazione predefinita. Puoi disabilitarlo impostando spark.databricks.sqldw.pushdown
su false
.
Gestione temporanea dei dati
Il connettore Azure Synapse non elimina i file temporanei creati nel contenitore di archiviazione di Azure. Databricks consiglia di eliminare periodicamente i file temporanei nel percorso fornito dall'utente tempDir
.
Per facilitare la pulizia dei dati, il connettore Azure Synapse non archivia i file di dati direttamente in tempDir
, ma crea invece una sottodirectory del modulo: <tempDir>/<yyyy-MM-dd>/<HH-mm-ss-SSS>/<randomUUID>/
. È possibile configurare processi periodici (usando la funzionalità processi di Azure Databricks o in altro modo) per eliminare in modo ricorsivo tutte le sottodirectory precedenti a una determinata soglia (ad esempio, 2 giorni), presupponendo che i processi Spark non possano essere eseguiti più a lungo di tale soglia.
Un'alternativa più semplice consiste nell'eliminare periodicamente l'intero contenitore e crearne uno nuovo con lo stesso nome. Ciò richiede l'uso di un contenitore dedicato per i dati temporanei prodotti dal connettore Azure Synapse e che sia possibile trovare un intervallo di tempo in cui è possibile garantire che non siano in esecuzione query che coinvolgono il connettore.
Gestione temporanea degli oggetti
Il connettore Azure Synapse automatizza il trasferimento dei dati tra un cluster di Azure Databricks e un'istanza di Azure Synapse. Per leggere i dati da una tabella di Azure Synapse o eseguire query o scrivere dati in una tabella di Azure Synapse, il connettore Azure Synapse crea oggetti temporanei, tra cui DATABASE SCOPED CREDENTIAL
, EXTERNAL DATA SOURCE
EXTERNAL FILE FORMAT
, e EXTERNAL TABLE
dietro le quinte. Questi oggetti vivono solo per tutta la durata del processo Spark corrispondente e vengono eliminati automaticamente.
Quando un cluster esegue una query usando il connettore Azure Synapse, se il processo del driver Spark si arresta in modo anomalo o viene riavviato forzatamente o se il cluster viene terminato o riavviato forzatamente, è possibile che gli oggetti temporanei non vengano eliminati. Per facilitare l'identificazione e l'eliminazione manuale di questi oggetti, il connettore Azure Synapse antepone i nomi di tutti gli oggetti temporanei intermedi creati nell'istanza di Azure Synapse con un tag del formato: tmp_databricks_<yyyy_MM_dd_HH_mm_ss_SSS>_<randomUUID>_<internalObject>
.
È consigliabile cercare periodicamente oggetti persi usando query come le seguenti:
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_%'