Creare tabelle delta
Quando si crea una tabella in un lakehouse di Microsoft Fabric, viene definita una tabella delta nel metastore del lakehouse e i dati della tabella vengono archiviati nei file Parquet sottostanti alla tabella.
Con la maggior parte degli strumenti interattivi dell'ambiente Microsoft Fabric, i dettagli del mapping della definizione della tabella nel metastore fino ai file sottostanti vengono estratti. Tuttavia, quando si lavora con Apache Spark in un lakehouse, si ha un maggiore controllo sulla creazione e la gestione delle tabelle delta.
Creazione di una tabella delta da un dataframe
Uno dei modi più semplici per creare una tabella delta in Spark consiste nel salvare un dataframe nel formato delta. Ad esempio, il codice PySpark seguente carica un dataframe con i dati di un file esistente, quindi lo salva come tabella delta:
# Load a file into a dataframe
df = spark.read.load('Files/mydata.csv', format='csv', header=True)
# Save the dataframe as a delta table
df.write.format("delta").saveAsTable("mytable")
Il codice specifica che la tabella deve essere salvata in formato delta con un nome di tabella specificato. I dati della tabella vengono salvati in file Parquet (indipendentemente dal formato del file di origine caricato nel dataframe) nell'area di archiviazione Tabelle nel lakehouse, insieme a una cartella _delta_log contenente i log delle transazioni per la tabella. La tabella viene elencata nella cartella Tabelle per il lakehouse nel riquadro Esplora dati.
Tabelle gestite e esterne
Nell'esempio precedente, il dataframe è stato salvato come tabella gestita. Ciò significa che la definizione della tabella nel metastore e i file di dati sottostanti sono entrambi gestiti dal runtime di Spark per il lakehouse Fabric. L'eliminazione della tabella comporta anche l'eliminazione dei file sottostanti dalla posizione di archiviazione delle Tabelle per il lakehouse.
È anche possibile creare tabelle come tabelle esterne, in cui la definizione della tabella relazionale nel metastore viene mappata in una posizione di archiviazione file alternativa. Ad esempio, il codice seguente crea una tabella esterna i cui dati sono memorizzati nella cartella della posizione di archiviazione File per il lakehouse:
df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")
In questo esempio, la definizione della tabella viene creata nel metastore (quindi la tabella viene elencata nell'interfaccia utente Tabelle del lakehouse), ma i file di dati Parquet e i file di log JSON della tabella vengono archiviati nel percorso di archiviazione File (e verranno visualizzati nel nodo File nel riquadro Lakehouse Explorer).
È anche possibile specificare un percorso completo qualificato per una posizione di archiviazione, come questo:
df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")
L'eliminazione di una tabella esterna dal metastore lakehouse non elimina i file di dati associati.
Creazione dei metadati di tabella
Mentre è comune creare una tabella a partire da dati esistenti in un dataframe, esistono scenari in cui è possibile creare una definizione di tabella nel metastore da popolare con i dati con altre modalità. Esistono diversi modi per raggiungere questo obiettivo.
Usare l'API DeltaTableBuilder
L'API DeltaTableBuilder consente di scrivere codice Spark per creare una tabella in base alle specifiche. Ad esempio, il codice seguente crea una tabella con il nome e le colonne specificate.
from delta.tables import *
DeltaTable.create(spark) \
.tableName("products") \
.addColumn("Productid", "INT") \
.addColumn("ProductName", "STRING") \
.addColumn("Category", "STRING") \
.addColumn("Price", "FLOAT") \
.execute()
Usare Spark SQL
È possibile creare tabelle delta anche tramite l'istruzione Spark SQL CREATE TABLE
, come illustrato in questo esempio:
%%sql
CREATE TABLE salesorders
(
Orderid INT NOT NULL,
OrderDate TIMESTAMP NOT NULL,
CustomerName STRING,
SalesTotal FLOAT NOT NULL
)
USING DELTA
L'esempio precedente crea una tabella gestita. È anche possibile creare una tabella esterna specificando il parametro LOCATION
, come illustrato di seguito:
%%sql
CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'
Quando si crea una tabella esterna, lo schema della tabella viene determinato dai file Parquet contenenti i dati nel percorso specificato. Questo approccio può essere utile quando si vuole creare una definizione di tabella che faccia riferimento a dati già salvati in formato delta o che sia basata su una cartella in cui si prevede di inserire i dati in formato delta.
Salvataggio dei dati in formato delta
Finora è stato illustrato come salvare un dataframe come tabella delta (creando sia la definizione dello schema della tabella nel metastore sia i file di dati in formato delta) e come creare la definizione della tabella (che crea lo schema della tabella nel metastore senza salvare alcun file di dati). Una terza possibilità è quella di salvare i dati in formato delta senza creare una definizione di tabella nel metastore. Questo approccio può essere utile per rendere permanenti i risultati delle trasformazioni dei dati eseguite in Spark in un formato di file in cui è possibile in seguito "sovrapporre" una definizione di tabella o un processo usando direttamente l'API delta lake.
Ad esempio, il codice PySpark seguente salva un dataframe in un nuovo percorso della cartella in formato delta:
delta_path = "Files/mydatatable"
df.write.format("delta").save(delta_path)
I file Delta vengono salvati in formato Parquet nel percorso specificato e includono una cartella _delta_log contenente i file di log delle transazioni. I log delle transazioni registrano qualsiasi cambiamento nei dati, come gli aggiornamenti apportati alle tabelle esterne o tramite l'API Delta Lake.
È possibile sostituire il contenuto di una cartella esistente con i dati di un dataframe usando la modalità di overwrite, come illustrato qui:
new_df.write.format("delta").mode("overwrite").save(delta_path)
È anche possibile aggiungere righe da un dataframe a una cartella esistente usando la modalità append:
new_rows_df.write.format("delta").mode("append").save(delta_path)
Suggerimento
Se si usa la tecnica descritta qui per salvare un dataframe nella posizione Tabelle nel lakehouse, Microsoft Fabric usa una funzionalità di individuazione automatica delle tabelle per creare i metadati della tabella corrispondente nel metastore.