Tabelle di metadati condivisi di Azure Synapse Analytics
Azure Synapse Analytics consente ai diversi motori di calcolo delle aree di lavoro di condividere database e tabelle tra i pool di Apache Spark e il pool SQL serverless.
Dopo la creazione di un database tramite un processo Spark, è possibile aggiungervi tabelle create con Spark che usano Parquet, Delta o CSV come formato di archiviazione. I nomi delle tabelle verranno convertiti in lettere minuscole e devono essere sottoposti a query usando il nome minuscolo. Queste tabelle diventeranno immediatamente disponibili per l'esecuzione di query da parte di qualsiasi pool di Spark dell'area di lavoro di Azure Synapse. Possono essere usate anche da qualsiasi processo Spark che disponga delle autorizzazioni necessarie.
Le tabelle Spark create, gestite ed esterne vengono rese disponibili anche come tabelle esterne con lo stesso nome nel database sincronizzato corrispondente nel pool SQL serverless. La sezione Esposizione di una tabella di Spark in SQL fornisce informazioni dettagliate sulla sincronizzazione delle tabelle.
Poiché le tabelle vengono sincronizzate con il pool SQL serverless in modo asincrono, vengono visualizzate con un piccolo ritardo.
Gestire una tabella creata in Spark
Usare Spark per gestire i database creati in Spark. Ad esempio, è possibile eliminare un database tramite un processo del pool di Apache Spark serverless creare al suo interno tabelle da Spark.
Gli oggetti nei database sincronizzati non possono essere modificati dal pool SQL serverless.
Esposizione di una tabella Spark in SQL
Tabelle Spark condivise
Spark fornisce due tipi di tabelle che vengono esposte automaticamente da Azure Synapse in SQL:
Tabelle gestite
Spark offre diverse opzioni per l'archiviazione dei dati in tabelle gestite, come TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA e LIBSVM. Questi file sono normalmente archiviati nella directory
warehouse
in cui sono archiviati i dati delle tabelle gestite.Tabelle esterne
Spark consente anche di creare tabelle esterne su dati esistenti, tramite l'opzione
LOCATION
o il formato Hive. Queste tabelle esterne possono essere su diversi formati di dati, tra cui Parquet.
Azure Synapse attualmente condivide solo le tabelle di Spark gestite ed esterne che archiviano i dati in formato Parquet, DELTA o CSV con i motori SQL. Le tabelle supportate da altri formati non vengono sincronizzate automaticamente. È possibile sincronizzare tali tabelle in modo esplicito come tabella esterna nel proprio database SQL se il motore SQL supporta il formato sottostante della tabella.
Nota
Attualmente, solo i formati Parquet e CSV sono completamente supportati nel pool SQL serverless. Le tabelle Delta Spark sono disponibili anche nel pool SQL serverless, ma questa funzionalità si trova in anteprima pubblica. Le tabelle esterne create in Spark non sono disponibili nei database del pool SQL dedicato.
Condivisione di tabelle Spark
Le tabelle di Spark gestite ed esterne condivisibili vengono esposte nel motore SQL come tabelle esterne con le proprietà seguenti:
- L'origine dati della tabella esterna SQL è l'origine dati che rappresenta la cartella in cui si trova la tabella di Spark.
- Il formato di file della tabella esterna SQL è Parquet, Delta o CSV.
- Le credenziali di accesso della tabella esterna SQL sono pass-through.
Poiché tutti i nomi di tabella Spark sono nomi di tabella SQL validi e tutti i nomi di colonna Spark sono nomi di colonna SQL validi, i nomi della tabella Spark e delle sue colonne verranno usati per la tabella esterna SQL.
Le tabelle di Spark forniscono tipi di dati diversi rispetto ai motori Synapse SQL. La tabella seguente mostra il mapping dei tipi di dati delle tabelle di Spark ai tipi SQL:
Tipo di dati Spark | Tipo di dati SQL | Commenti |
---|---|---|
LongType , long , bigint |
bigint |
Spark: LongType rappresenta numeri interi con segno a 8 byte. SQL: vedere int, bigint, smallint e tinyint. |
BooleanType , boolean |
bit (Parquet), varchar(6) (CSV) |
Spark: booleano. SQL: vedere [/sql/t-sql/data-types/bit-transact-sql). |
DecimalType , decimal , dec numeric |
decimal |
Spark: DecimalType rappresenta numeri decimali con segno a precisione arbitraria. Supportato internamente da java.math.BigDecimal. Un valore BigDecimal è costituito da un valore integer di precisione arbitrario senza scalabilità e da una scala di interi a 32 bit. SQL: numeri con precisione e scala fisse. Se viene utilizzata la precisione massima, i valori validi sono compresi nell'intervallo da - 10^38 +1 a 10^38 - 1. I sinonimi ISO per decimal sono dec e dec(p, s). Dal punto di vista funzionale, numeric è identico a decimal. Vedere decimale e numerico. |
IntegerType , Integer , int |
int |
Spark IntegerType rappresenta 4 numeri interi con segno a 4 byte. SQL: vedere int, bigint, smallint e tinyint. |
ByteType , Byte , tinyint |
smallint |
Spark: ByteType rappresenta un numero intero con segno a 1 byte [-128-127] e ShortType rappresenta 2 numeri interi con segno di byte [-32768 a 32767]. SQL: Tinyint rappresenta 1 numero intero con segno di byte [0, 255] e smallint rappresenta 2 numeri interi con segno di byte [-32768, 32767]. Vedere int, bigint, smallint, and tinyint. |
ShortType , Short , smallint |
smallint |
Come sopra. |
DoubleType , Double |
float |
Spark: DoubleType rappresenta numeri a virgola mobile a 8 byte a precisione doppia. SQL: vedere float e real. |
FloatType , float , real |
real |
Spark: FloatType rappresenta numeri a virgola mobile a 4 byte a precisione doppia. SQL: vedere float e real. |
DateType , date |
date |
Spark: DateType rappresenta i valori che comprendono i valori di campi anno, mese e giorno, senza un fuso orario. SQL: vedere data. |
TimestampType , timestamp |
datetime2 |
Spark: TimestampType rappresenta i valori che comprendono i valori di campi anno, mese, giorno, ora, minuto e secondo, con il fuso orario locale della sessione. Il valore timestamp rappresenta un punto assoluto nel tempo. SQL: vedere datetime2. |
char |
char |
|
StringType , String , varchar |
Varchar(n) |
Spark: StringType rappresenta i valori stringa di caratteri. VarcharType(n) è una variante di StringType che presenta una limitazione di lunghezza. La scrittura dei dati avrà esito negativo se la stringa di input supera il limite di lunghezza. Questo tipo può essere usato solo nello schema della tabella, non in funzioni/operatori. CharType(n) è una variante di VarcharType(n) che è a lunghezza fissa. La lettura della colonna di tipo CharType(n) restituisce sempre valori stringa di lunghezza n. Il confronto tra colonne CharType(n) ridimensionerà la più corta alla lunghezza della più lunga. SQL: se è presente una lunghezza fornita da Spark, n in varchar(n) verrà impostata su tale lunghezza. Se è una colonna partizionata, n può essere max 2048. In caso contrario, sarà varchar(max). Vedere char e varchar. Usare con regole di confronto Latin1_General_100_BIN2_UTF8 . |
BinaryType , binary |
varbinary(n) |
SQL: se è presente una lunghezza fornita da Spark, n in Varbinary(n) verrà impostata su tale lunghezza. Se è una colonna partizionata, n può essere max 2048. In caso contrario, sarà Varbinary(max). Vedere binary e varbinary. |
array , map , struct |
varchar(max) |
SQL: serializzazione in JSON con regole di confronto Latin1_General_100_BIN2_UTF8 . Vedere dati JSON. |
Nota
Le regole di confronto a livello di database sono Latin1_General_100_CI_AS_SC_UTF8
.
Modello di sicurezza
I database e le tabelle Spark e le relative rappresentazioni sincronizzate nel motore SQL verranno protette a livello di archiviazione sottostante. Poiché attualmente non dispongono delle autorizzazioni per gli oggetti stessi, gli oggetti possono essere visualizzati in Esplora oggetti.
L'entità di sicurezza che crea una tabella gestita è considerata il proprietario di tale tabella e dispone di tutti i diritti sulla tabella e sulle cartelle e i file sottostanti. Inoltre, il proprietario del database diventa automaticamente co-proprietario della tabella.
Se si crea una tabella esterna di Spark o SQL con autenticazione pass-through, i dati vengono protetti solo a livello di cartella e file. Se un utente esegue una query su questo tipo di tabella esterna, l'identità di sicurezza dell'utente che ha inviato la query viene passata al file system, che verificherà i diritti di accesso.
Per altre informazioni su come impostare le autorizzazioni su cartelle e file, vedere Database condiviso di Azure Synapse Analytics.
Esempi
Creare una tabella gestita in Spark ed eseguire query dal pool SQL serverless
In questo scenario si ha un database Spark denominato mytestdb
. Vedere Creare e connettersi a un database Spark con il pool SQL serverless.
Creare una tabella di Spark gestita con SparkSQL eseguendo il comando seguente:
CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet
Questo comando crea la tabella myparquettable
nel database mytestdb
. I nomi delle tabelle verranno convertiti in lettere minuscole. Dopo una breve attesa, la tabella viene visualizzata nel pool SQL serverless. Ad esempio, eseguire l'istruzione seguente dal pool SQL serverless.
USE mytestdb;
SELECT * FROM sys.tables;
Verificare che myparquettable
sia incluso nei risultati.
Nota
Una tabella il cui formato di archiviazione non è Delta, Parquet o CSV non verrà sincronizzata.
Inserire quindi alcuni valori nella tabella da Spark, ad esempio con le istruzioni Spark C# seguenti in un notebook C#:
using Microsoft.Spark.Sql.Types;
var data = new List<GenericRow>();
data.Add(new GenericRow(new object[] { 1, "Alice", new Date(2010, 1, 1)}));
data.Add(new GenericRow(new object[] { 2, "Bob", new Date(1990, 1, 1)}));
var schema = new StructType
(new List<StructField>()
{
new StructField("id", new IntegerType()),
new StructField("name", new StringType()),
new StructField("birthdate", new DateType())
}
);
var df = spark.CreateDataFrame(data, schema);
df.Write().Mode(SaveMode.Append).InsertInto("mytestdb.myparquettable");
È ora possibile leggere i dati dal pool SQL serverless come segue:
SELECT * FROM mytestdb.myparquettable WHERE name = 'Alice';
Si dovrebbe ottenere la riga seguente come risultato:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01
Creare una tabella esterna in Spark ed eseguire query dal pool SQL serverless
In questo esempio verrà creata una tabella Spark esterna sui file di dati Parquet creati nell'esempio precedente per la tabella gestita.
Ad esempio, con SparkSQL eseguire:
CREATE TABLE mytestdb.myexternalparquettable
USING Parquet
LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"
Sostituire il segnaposto <storage-name>
con il nome dell'account di archiviazione ADLS Gen2 in uso, <fs>
con il nome del file system in uso e il segnaposto <synapse_ws>
con il nome dell'area di lavoro di Azure Synapse usata per eseguire questo esempio.
L'esempio precedente crea la tabella myextneralparquettable
nel database mytestdb
. Dopo una breve attesa, la tabella viene visualizzata nel pool SQL serverless. Ad esempio, eseguire l'istruzione seguente dal pool SQL serverless.
USE mytestdb;
SELECT * FROM sys.tables;
Verificare che myexternalparquettable
sia incluso nei risultati.
È ora possibile leggere i dati dal pool SQL serverless come segue:
SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';
Si dovrebbe ottenere la riga seguente come risultato:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01