Condividi tramite


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, decnumeric 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

Passaggi successivi