Creare tabelle delta

Completato

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 per la tabella vengono salvati in file Parquet (indipendentemente dal formato del file di origine caricato nel dataframe) nell'area di archiviazione Tabelle del lakehouse, insieme a una cartella _delta_log contenente i log delle transazioni per la tabella. La tabella è elencata nella cartella Tabelle per il lakehouse nel riquadro Esplora dati .

Tabelle gestite ed esterne

Nell'esempio precedente il dataframe è stato salvato come tabella gestita ; vale a dire che la definizione di tabella nel metastore e i file di dati sottostanti sono entrambi gestiti dal runtime di Spark per fabric lakehouse. 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, dove la definizione di tabella relazionale nel metastore è associata a un percorso di archiviazione file alternativo. Ad esempio, il codice seguente crea una tabella esterna per cui i dati vengono archiviati nella cartella nel percorso di archiviazione File per il lakehouse:

df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")

In questo esempio, la definizione di tabella viene creata nel metastore (quindi la tabella è elencata nell'interfaccia utente Tabelle per il lakehouse), ma i file di dati Parquet e i file di log JSON per la 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 di 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 in un dataframe usando la modalità di sovrascrittura , come illustrato di seguito:

new_df.write.format("delta").mode("overwrite").save(delta_path)

È anche possibile aggiungere righe da un dataframe a una cartella esistente usando la modalità di accodamento :

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 nella lakehouse, Microsoft Fabric usa una funzionalità di individuazione automatica delle tabelle per creare i metadati della tabella corrispondenti nel metastore.