Creare ed eseguire query su tabelle di catalogo

Completato

Finora sono state considerate le istanze di tabella di Delta Lake create da dataframe e modificate tramite l'API Delta Lake. È anche possibile definire tabelle Delta Lake come tabelle di catalogo nel metastore e usarle usando SQL.

Tabelle esterne e gestite

Le tabelle in un catalogo Spark, incluse le tabelle di Delta Lake, possono essere gestite o esterne; ed è importante comprendere la differenza tra questi due tipi di tabella.

  • Una tabella gestita viene definita senza un percorso specificato e i file di dati vengono archiviati all'interno della risorsa di archiviazione usata dal metastore. L'eliminazione della tabella non solo rimuove i metadati dal catalogo, ma elimina anche la cartella in cui sono archiviati i file di dati.
  • Una tabella esterna viene definita per un percorso di file personalizzato, in cui vengono archiviati i dati per la tabella. I metadati per la tabella sono definiti nel catalogo Spark. L'eliminazione della tabella elimina i metadati dal catalogo, ma non ha effetto sui file di dati.

Creazione di tabelle di catalogo

Esistono diversi modi per creare tabelle di catalogo.

Creazione di una tabella di catalogo da un dataframe

È possibile creare tabelle gestite scrivendo un dataframe usando l'operazione saveAsTable come illustrato negli esempi seguenti:

# Save a dataframe as a managed table
df.write.format("delta").saveAsTable("MyManagedTable")

## specify a path option to save as an external table
df.write.format("delta").option("path", "/mydata").saveAsTable("MyExternalTable")

Creazione di una tabella di catalogo usando SQL

È anche possibile creare una tabella di catalogo usando l'istruzione SQL CREATE TABLE con la clausola USING DELTA e un parametro LOCATION facoltativo per le tabelle esterne. È possibile eseguire l'istruzione usando l'API SparkSQL, come nell'esempio seguente:

spark.sql("CREATE TABLE MyExternalTable USING DELTA LOCATION '/mydata'")

In alternativa, è possibile usare il supporto SQL nativo in Spark per eseguire l'istruzione:

%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'

Suggerimento

L'istruzione CREATE TABLE restituisce un errore se nel catalogo esiste già una tabella con il nome specificato. Per correggere questo comportamento, è possibile usare un'istruzione CREATE TABLE IF NOT EXISTS o l'istruzione CREATE OR REPLACE TABLE.

Definizione dello schema della tabella

In tutti gli esempi precedenti la tabella viene creata senza uno schema esplicito. Nel caso di tabelle create scrivendo un dataframe, lo schema della tabella viene ereditato dal dataframe. Quando si crea una tabella esterna, lo schema viene ereditato da tutti i file attualmente archiviati nel percorso della tabella. Tuttavia, quando si crea una nuova tabella gestita o una tabella esterna con una posizione attualmente vuota, si definisce lo schema della tabella specificando i nomi, i tipi e il supporto di valori Null per le colonne come parte dell'istruzione CREATE TABLE, come illustrato nell'esempio seguente:

%sql

CREATE TABLE ManagedSalesOrders
(
    Orderid INT NOT NULL,
    OrderDate TIMESTAMP NOT NULL,
    CustomerName STRING,
    SalesTotal FLOAT NOT NULL
)
USING DELTA

Quando si usa Delta Lake, gli schemi di tabella vengono applicati: tutti gli inserimenti e gli aggiornamenti devono essere conformi ai tipi di dati e al supporto dei valori Null della colonna specificati.

Uso dell'API DeltaTableBuilder

È possibile usare l'API DeltaTableBuilder (parte dell'API Delta Lake) per creare una tabella di catalogo, come illustrato nell'esempio seguente:

from delta.tables import *

DeltaTable.create(spark) \
  .tableName("default.ManagedProducts") \
  .addColumn("Productid", "INT") \
  .addColumn("ProductName", "STRING") \
  .addColumn("Category", "STRING") \
  .addColumn("Price", "FLOAT") \
  .execute()

Analogamente all'istruzione SQL CREATE TABLE, il metodo create restituisce un errore se esiste già una tabella con il nome specificato. È possibile correggere questo comportamento usando il metodo createIfNotExists o createOrReplace.

Uso di tabelle di catalogo

È possibile usare tabelle di catalogo come tabelle in qualsiasi database relazionale basato su SQL, eseguendo query e manipolandole usando istruzioni SQL standard. Nell'esempio di codice seguente, ad esempio, viene usata un'istruzione SELECT per eseguire una query sulla tabella ManagedSalesOrders:

%sql

SELECT orderid, salestotal
FROM ManagedSalesOrders

Suggerimento

Per altre informazioni sull'uso di Delta Lake, vedere Table batch reads and writes nella documentazione di Delta Lake.