Vai al contenuto principale

CREATE TABLE in Databricks: guida completa per creare e gestire tabelle

Scopri come creare tabelle in Databricks usando il comando CREATE TABLE. Impara metodi diversi per scenari diversi, incluso come creare una tabella da dati esistenti e come usare CREATE TABLE AS SELECT.
· 10 min leggi

Scopri con l'IA

Le tabelle di Databricks sono un componente fondamentale della piattaforma Databricks Lakehouse, progettate per gestire l'archiviazione e l'elaborazione di dati su larga scala. Queste tabelle consentono la collaborazione tra team unificando dati strutturati e non strutturati e supportando carichi di lavoro analitici.

In questo articolo, ti guiderò tra le diverse tecniche per creare tabelle in Databricks usando il comando CREATE TABLE con diverse varianti di sintassi per coprire vari casi d'uso. Condividerò anche suggerimenti sulle best practice per creare e gestire tabelle in Databricks in modo efficiente e affidabile.

Per cominciare, ti consiglio vivamente di leggere il post del blog di DataCamp How to Learn Databricks: A Beginner’s Guide to the Unified Data Platform per capire le funzionalità principali e le applicazioni di Databricks e seguire un percorso strutturato per iniziare a imparare. Ti consiglio anche il nostro corso Introduction to Databricks. Anche se hai esperienza con SQL, vedrai che nella piattaforma Databricks Lakehouse alcune cose possono apparire diverse. Gli esercizi interattivi del corso ti guideranno tra query SQL, funzionalità della piattaforma e connessioni a sistemi esterni.

Introduzione alle tabelle di Databricks

Per iniziare, va detto che le tabelle di Databricks sono dataset strutturati che facilitano l'organizzazione e l'accesso ai dati nell'ambiente Databricks Lakehouse. Ce ne sono di due tipi:

  • Managed Tables: sono tabelle completamente gestite da Databricks, che amministra sia l'archiviazione sia i metadati. Quando si crea una tabella gestita, Databricks si occupa dei file sottostanti e, se la tabella viene eliminata, anche i relativi dati vengono rimossi. 
  • External Tables: fanno riferimento a dati che risiedono al di fuori di Databricks, tipicamente in sistemi di cloud storage come AWS S3 o Azure Blob Storage. Mentre Databricks gestisce i metadati di queste tabelle, i dati effettivi restano intatti anche se la tabella viene eliminata. Sono note anche come tabelle non gestite (unmanaged).

Le tabelle in Databricks predefiniscono spesso Delta Lake grazie alle sue funzionalità avanzate e ottimizzazioni. Delta Lake offre transazioni ACID, scalabilità, miglioramenti prestazionali come ottimizzazioni quali caching e indicizzazione, e una gestione unificata di batch e streaming.

Da notare che le prime versioni di Azure Databricks utilizzavano le tabelle nel vecchio “formato Hive”, che sono state sostituite dalle moderne tabelle Delta. In generale, le tabelle Delta moderne superano le tabelle Hive legacy in affidabilità e prestazioni, diventando la scelta predefinita per i workflow in Databricks.

Ecco un riepilogo che può aiutarti a vedere la differenza tra le due:

FunzionalitàTabella in formato HiveTabella Delta
Formato dei datiApache Hive (CSV, Parquet, ORC, ecc.)Delta Lake (basato su Parquet con metadati)
TransazioniNessun supporto ACID (consistenza eventuale)Piene transazioni ACID
Gestione dello schemaApplicazione limitataApplicazione rigorosa dello schema
Ottimizzazione delle prestazioniRichiede tuning manualeOttimizzazioni integrate (caching, compattazione)
Time travelNessun supporto integrato per query storicheSupporta il time travel per interrogare versioni precedenti dei dati
ConcorrenzaSoggetta a conflitti durante update o deleteGestisce in modo efficiente le operazioni concorrenti

Varianti della sintassi di CREATE TABLE

Il comando CREATE TABLE in Databricks supporta più varianti per adattarsi a casi diversi. Ogni variante ha il suo scopo, con opzioni mirate come posizione dei file, clonazione e gestione dei metadati. Se vuoi rinfrescare le nozioni su Databricks SQL, ti consiglio di leggere il nostro tutorial Databricks SQL per imparare, tra le altre cose, come usare un Notebook in un warehouse SQL di Databricks.

Di seguito trovi i principali stili di sintassi con esempi e spiegazioni.

CREATE TABLE [USING]

Questa sintassi crea una nuova tabella con uno schema e un formato dati specificati. La query seguente crea una tabella chiamata sales_data leggendo dati da file Parquet archiviati in una posizione specifica.

-- Create a table from files in a specific format
CREATE TABLE sales_data
USING PARQUET
LOCATION '/mnt/data/sales';

CREATE TABLE (formato Hive)

Questa sintassi legacy è simile al comando SQL standard CREATE TABLE, usata per definire una tabella con metadati gestiti da Databricks senza dover fare riferimento a file esterni. La query sotto crea una tabella in stile Hive chiamata hive_table con uno schema predefinito e ulteriori proprietà di metadati.

-- Hive-style table creation with schema definition
CREATE TABLE hive_table (
    id INT,
    name STRING
)
COMMENT 'Hive format example'
TBLPROPERTIES ('created_by' = 'databricks');

Nella query sopra, la clausola COMMENT aggiunge metadati descrittivi mentre TBLPROPERTIES memorizza proprietà personalizzate sulla tabella.

CREATE TABLE LIKE

Questo comando crea una nuova tabella usando lo schema e le proprietà di una tabella esistente. Usa questa sintassi quando vuoi replicare la struttura di una tabella esistente senza copiarne i dati. È utile per test o sviluppo.

-- Create a table with the same schema as another table
CREATE TABLE new_table LIKE existing_table;

CREATE TABLE CLONE

Questa sintassi consente di creare una nuova tabella clonando una tabella Delta Lake esistente, come deep o shallow clone. Quindi, dovresti usare la sintassi CREATE TABLE CLONE quando ti serve una copia indipendente dei dati e dei metadati di una tabella (deep clone) o solo dei metadati facendo riferimento ai dati originali (shallow clone). Pensala per versioning o creazione di backup.

L'esempio seguente mostra le query per creare tabelle deep clone e shallow clone in Databricks.

 -- Deep clone by default
CREATE TABLE cloned_table CLONE original_table;

-- Shallow clone
CREATE TABLE shallow_clone_table SHALLOW CLONE original_table;  

CREATE OR REPLACE TABLE

Questo comando combinato sostituisce una tabella esistente con una nuova, mantenendo lo stesso nome, in un'unica operazione. Usa questa sintassi quando vuoi sovrascrivere completamente una tabella esistente mantenendone il nome. È particolarmente utile per aggiornare la struttura o i dati di una tabella senza doverla prima eliminare.

La query di esempio qui sotto crea o sostituisce la tabella sales con un nuovo schema.

-- Create or replace a sales table with a new schema
CREATE OR REPLACE TABLE sales (
    sale_id INT,
    amount FLOAT
)
USING DELTA
LOCATION '/mnt/delta/sales';

Ci sono altre clausole rilevanti che puoi usare con la sintassi CREATE TABLE in Databricks per gestire le tabelle in base a requisiti specifici. Di seguito trovi un riepilogo dell'uso di ciascuna clausola. Ne ho usate alcune ma non tutte negli esempi precedenti.

  • IF NOT EXISTS: evita errori saltando la creazione se la tabella esiste già.

  • USING: specifica il formato dei file (ad es. Delta, Parquet, CSV).

  • EXTERNAL: dichiara una tabella i cui dati risiedono fuori dallo storage gestito da Databricks.

  • PARTITIONED BY: definisce le partizioni per ottimizzare dataset di grandi dimensioni.

  • LOCATION: indica la directory che contiene i dati della tabella.

  • TBLPROPERTIES: aggiunge metadati per configurazioni e ottimizzazioni personalizzate della tabella.

Dimostrazioni passo passo

In questa sezione mostrerò diversi modi per creare e gestire tabelle in Databricks, con esempi concisi e spiegazioni delle clausole chiave. Ti consiglio il nostro tutorial Databricks Tutorial: 7 Must-know Concepts For Any Data Specialist per imparare a eseguire comandi SQL sulla piattaforma Databricks.

Come creare una tabella vuota

Per creare una tabella Delta vuota, definisci lo schema con nomi di colonne e tipi di dato. Usa la clausola USING DELTA per definire il formato della tabella e COMMENT per aggiungere metadati descrittivi.

Questa query crea una tabella Delta vuota chiamata employees con uno schema predefinito, che include le colonne id, name, department e hire_date. 

-- Create an empty Delta table with a defined schema
CREATE TABLE employees (
    id BIGINT,
    name STRING,
    department STRING,
    hire_date DATE
)
USING DELTA
COMMENT 'Table to store employee information';

Come creare una tabella da dati esistenti

Per creare una tabella da dati esistenti, collega la tabella a file di dati esterni in formati come CSV, Parquet o JSON. Puoi usare la clausola LOCATION per collegare la tabella al percorso file e USING per specificare il formato dei dati.

Ad esempio, la query seguente crea una tabella chiamata sales_data facendo riferimento a file Parquet archiviati in /mnt/data/sales_data/.

-- Create a table from Parquet files in a specified location
CREATE TABLE sales_data
USING PARQUET
LOCATION '/mnt/data/sales_data/';

Come creare una tabella as select (CTAS)

Puoi anche creare una tabella as select eseguendo una query e salvando il risultato. In questo scenario, la clausola AS SELECT popola la tabella con il risultato della query.

Ad esempio, la query seguente crea una nuova tabella chiamata high_value_sales selezionando e trasformando i dati dalla tabella esistente sales_data. Filtra le righe in cui total_amount è maggiore di 1000, mantenendo solo le colonne sale_id, customer_id e total_amount. 

-- Create a table by selecting and transforming data from another table
CREATE TABLE high_value_sales AS
SELECT
    sale_id,
    customer_id,
    total_amount
FROM sales_data
WHERE total_amount > 1000;

Come creare una tabella esterna

Creare una tabella esterna significa fare riferimento a dati archiviati al di fuori dello storage gestito da Databricks. Dovresti usare la clausola LOCATION per specificare la posizione esterna dei dati.

La query sotto crea una tabella Delta esterna chiamata external_table facendo riferimento a dati archiviati in /mnt/external_storage/external_table/.

-- Create an external table referencing data outside Databricks storage
CREATE TABLE external_table
USING DELTA
LOCATION '/mnt/external_storage/external_table/';

Come creare una tabella LIKE

Per creare una tabella LIKE, duplica lo schema di una tabella esistente senza copiarne i dati. Nell'esempio seguente, la query crea una nuova tabella chiamata sales_backup con lo stesso schema della tabella sales esistente.

-- Create a new sales table with the same schema as an existing table
CREATE TABLE sales_backup LIKE sales;

Come creare TABLE CLONE

Puoi creare un clone di tabella usando la clausola CLONE per creare una copia shallow o deep di una tabella Delta per backup o test.

Nell'esempio seguente, la query crea una nuova tabella, sales_shallow_clone, copiando solo i metadati (schema e proprietà della tabella).

-- Shallow clone: Copies only metadata (references original data)
CREATE TABLE sales_shallow_clone CLONE sales_data;

L'esempio seguente crea una nuova tabella, sales_deep_clone, ma copia sia i metadati sia i dati effettivi.

-- Deep clone: Copies both metadata and actual data
CREATE TABLE sales_deep_clone CLONE sales_data DEEP;

Come creare una tabella temporanea (temp table)

Usa la clausola TEMPORARY quando crei tabelle temporanee per garantire che la tabella sia specifica della sessione.

La query seguente crea una tabella temporanea chiamata temp_table che esiste solo per la sessione corrente. Seleziona id, name e sales_amount da sales_data, filtrando le righe in cui region = 'US'.

-- Create a temporary table that exists only in the session
CREATE TEMPORARY TABLE temp_table AS
SELECT
    id,
    name,
    sales_amount
FROM sales_data
WHERE region = 'US';

Come sostituire una tabella

Puoi usare la clausola CREATE OR REPLACE per sostituire definizione e contenuto della tabella. La query seguente sostituisce la tabella esistente updated_table con un nuovo schema e dati. Definisce la tabella con tre colonne (id, name, total_sales).

-- Replace an existing table with a new schema or data
CREATE OR REPLACE TABLE updated_table (
    id BIGINT,
    name STRING,
    total_sales DOUBLE
)
USING DELTA
LOCATION '/mnt/delta/updated_table/';

Argomenti avanzati

In questa sezione esplorerò funzionalità avanzate delle tabelle Databricks che migliorano funzionalità, prestazioni e sicurezza.

Colonne generate e colonne identity

Databricks supporta le colonne identity, che generano automaticamente valori unici per ogni nuova riga. Questa funzionalità è utile per creare chiavi surrogate nel data warehousing.

La query seguente crea una tabella employees con tre colonne: id, name e department. La colonna id è una identity che si auto-incrementa a ogni nuova riga.

-- Identity column: auto-incremented value
CREATE TABLE employees (
    id BIGINT GENERATED ALWAYS AS IDENTITY, -- Auto-incremented column
    name STRING,
    department STRING
);

Questa altra query crea una tabella sales con tre colonne: sale_id, sale_date e sale_year. La colonna sale_year è generata e calcolata automaticamente in base alla colonna sale_date usando la funzione YEAR(sale_date).

-- Generated column: derived from other columns
CREATE TABLE sales (
    sale_id BIGINT,
    sale_date DATE,
    sale_year INT GENERATED ALWAYS AS (YEAR(sale_date)) -- Derived column
);

Partitioning e clustering

Il partitioning suddivide i dati in blocchi più piccoli, migliorando le prestazioni delle query, mentre il clustering organizza i dati all'interno delle partizioni per letture più veloci.

Ad esempio, la query seguente crea una tabella partizionata in cui i dati sono suddivisi in partizioni in base alla colonna region, migliorando le prestazioni quando si filtra per regione.

-- Partitioned table
CREATE TABLE partitioned_table (
    id BIGINT,
    region STRING,
    sales_amount DOUBLE
)
USING DELTA
PARTITIONED BY (region); -- Querying by region will be faster

La query seguente ottimizza la tabella partizionata eseguendo il clustering dei dati all'interno di ogni partizione in base alla colonna sales_amount. Rende più veloci le query su sales_amount migliorando il layout dei dati per letture efficienti. La clausola ZORDER BY funziona all'interno delle partizioni per migliorare le prestazioni di lettura raggruppando i dati entro le partizioni, non tra partizioni.

-- Clustered table
OPTIMIZE partitioned_table
ZORDER BY (sales_amount); -- Clusters data within partitions for efficient reads

Mascheramento di colonne e filtri di riga

Il mascheramento delle colonne e i filtri di riga limitano la visibilità dei dati in base a ruoli o condizioni, proteggendo le informazioni sensibili.

Ad esempio, la query seguente crea una masked view chiamata masked_table basata sulla tabella employees. La colonna salary è oscurata (sostituita con REDACTED) per tutti gli utenti tranne quelli con ruolo manager. L'istruzione CASE fa sì che solo i manager vedano lo stipendio reale, mentre gli altri vedono i dati mascherati

-- Column masking: Redact sensitive data
CREATE MASKED VIEW masked_table AS
SELECT
    id,
    name,
    CASE
        WHEN current_user() = 'manager' THEN salary
        ELSE 'REDACTED'
    END AS salary
FROM employees;

Analogamente, la query seguente usa filtri di riga per creare o sostituire una view chiamata filtered_table basata sulla tabella sales. La view filtra le righe includendo solo i dati in cui region = 'US', limitando l'accesso ai soli dati di vendita degli Stati Uniti.

-- Row filters: Fine-grained access control
CREATE OR REPLACE VIEW filtered_table AS
SELECT *
FROM sales
WHERE region = 'US'; -- Limit data visibility to a specific region

Evoluzione dello schema

Databricks supporta l'evoluzione dello schema tramite CREATE OR REPLACE TABLE e modifiche alla tabella. Dovresti usare l'istruzione CREATE OR REPLACE TABLE per sovrascrivere schema e dati e ALTER TABLE per modificare lo schema in modo incrementale senza influire sui dati.

La query seguente sostituisce la tabella employees esistente con un nuovo schema, aggiungendo una nuova colonna hire_date mantenendo i dati in formato Delta.

-- Schema evolution with CREATE OR REPLACE TABLE
CREATE OR REPLACE TABLE employees (
    id BIGINT,
    name STRING,
    department STRING,
    hire_date DATE -- New column added
)
USING DELTA;

Quest'altra query modifica la tabella employees aggiungendo una nuova colonna salary allo schema esistente.

-- Altering a table schema
ALTER TABLE employees ADD COLUMNS (salary DOUBLE);

Ottimizzazione delle prestazioni

Per ottimizzare le prestazioni per tabelle su larga scala, puoi usare varie proprietà e tecniche come l'auto-ottimizzazione e lo Z-ordering.

Nell'esempio seguente, la query abilita l'auto-ottimizzazione su delta_table impostando proprietà per compattare automaticamente i file piccoli e fonderli in fase di scrittura, migliorando l'efficienza di archiviazione.

-- Enable automatic optimizations
ALTER TABLE delta_table
SET TBLPROPERTIES (
    'delta.autoOptimize.optimizeWrite' = 'true', -- Automatically compact small files
    'delta.autoOptimize.autoCompact' = 'true'   -- Automatically merge files
);

Analogamente, la query seguente ottimizza delta_table raggruppando i dati in base a region e sales_date per migliorare le prestazioni delle query, soprattutto per i filtri su queste colonne.

-- Perform clustering for faster query performance
OPTIMIZE delta_table
ZORDER BY (region, sales_date); -- Improves query efficiency for frequent filters

Best practice e considerazioni

Ecco alcuni aspetti da considerare quando crei tabelle in Databricks, per fare le cose nel modo giusto:

  • Convenzioni di denominazione delle tabelle: usa sempre nomi chiari e coerenti per migliorare la reperibilità e ridurre gli errori. Evita caratteri speciali o nomi eccessivamente lunghi per prevenire problemi di compatibilità.
  • Sicurezza e permessi: utilizza Unity Catalog per il controllo centralizzato degli accessi su tutte le risorse dati. Usa le Access Control List (ACL) per limitare chi può visualizzare o modificare i dati. Inoltre, maschera i dati sensibili con il mascheramento delle colonne o filtri di riga.
  • Backup e ripristino: fai affidamento sulla cronologia delle versioni di Delta Lake per un facile ripristino e time travel. Monitora e gestisci regolarmente la conservazione delle versioni storiche per bilanciare costi di storage ed esigenze di ripristino.
  • Tabelle gestite vs. esterne: è importante anche capire la differenza tra tabelle gestite ed esterne. Nelle tabelle gestite, Databricks gestisce sia i metadati sia i dati. È l'ideale quando vuoi il pieno controllo sul ciclo di vita dei dati. Nelle tabelle esterne, invece, i dati di riferimento sono archiviati al di fuori di Databricks. Questo è utile per mantenere il controllo su dati condivisi tra piattaforme o sistemi diversi.

Errori comuni e troubleshooting

Ora che abbiamo visto le best practice per gestire le tabelle in Databricks, vediamo i problemi più frequenti che potresti incontrare con le tabelle di Databricks, i relativi messaggi di errore tipici e le soluzioni.

Errori di posizione non vuota usando CREATE vs. CREATE OR REPLACE

Quando usi CREATE TABLE con una posizione specificata (clausola LOCATION), se la directory non è vuota potresti incontrare un errore come:

Error: Cannot create table because the location is not empty.

Questo errore si verifica perché il comando CREATE TABLE si aspetta una directory vuota per la posizione specificata, ma file o metadati esistenti entrano in conflitto con questo requisito. 

Per risolvere, usa l'istruzione CREATE OR REPLACE TABLE per sovrascrivere dati e metadati esistenti. In alternativa, ripulisci manualmente la directory prima di usare CREATE TABLE.

CREATE OR REPLACE TABLE delta_table
USING DELTA
LOCATION '/mnt/data/delta_table'; -- Overwrites table and files

Mismatch di schema o problemi con alcuni tipi di dato

L'inserimento o l'interrogazione dei dati produce errori di mismatch dello schema come:

Error: Schema mismatch: Expected column type STRING, but found INT.

L'errore può essere causato da una discrepanza tra lo schema della tabella e i tipi di dato in ingresso. Anche conversioni di tipo non supportate o ambigue (ad es. tipi annidati complessi) possono causare mismatch di schema. Per risolvere, applica l'enforcement dello schema per verificare lo schema durante la creazione della tabella o usa l'applicazione dello schema nelle tabelle Delta.

-- Enforce schema matching during table creation
CREATE TABLE schema_table (
    id INT,
    name STRING
)
USING DELTA
TBLPROPERTIES ('delta.schema.enforce' = 'true'); -- Enforces strict schema

Inoltre, consenti l'evoluzione dello schema quando aggiungi nuove colonne o modifichi tipi di dato.

ALTER TABLE schema_table ADD COLUMNS (new_column DOUBLE);

L'uso di cast espliciti dei tipi durante l'inserimento dei dati può aiutare a risolvere questo tipo di errore.

INSERT INTO schema_table SELECT CAST(id AS INT), CAST(name AS STRING) FROM source_table;

Limitazioni delle transazioni concorrenti con colonne identity

Quando usi colonne identity, potresti riscontrare problemi legati a transazioni concorrenti, come:

Error: Concurrent transactions detected on identity column table

Le colonne identity sono stateful e possono incontrare conflitti quando più transazioni tentano di inserire dati in parallelo. Per il troubleshooting, usa chiavi surrogate per sostituire le colonne identity con chiavi surrogate deterministiche generate con funzioni come uuid() o monotonically_increasing_id().

CREATE TABLE better_table AS
SELECT
    monotonically_increasing_id() AS id, -- Replaces identity column
    name, department
FROM source_data;

Puoi anche usare il MERGE di Delta Lake per workflow complessi di insert e update senza fare affidamento su colonne identity.

MERGE INTO target_table AS t
USING source_table AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;

Conclusione

In Databricks, il comando CREATE TABLE è uno strumento versatile per definire strutture dati, collegarsi a dati esterni e derivare nuovi dataset tramite query. È importante comprendere le diverse sintassi per creare e gestire tabelle in Databricks in base alle tue esigenze. Come hai visto, ci sono diversi metodi tra cui scegliere per creare tabelle.

Se vuoi approfondire i concetti fondamentali di Databricks, ti consiglio vivamente il corso di DataCamp Introduction to Databricks per conoscere Databricks come soluzione di data warehousing per la Business Intelligence (BI). Ti suggerisco anche il nostro post Databricks Certifications In 2025 per scoprire come ottenere le certificazioni Databricks, i benefici per la carriera e come scegliere quella giusta per i tuoi obiettivi professionali.

Allan Ouko

Autore

Allan Ouko

Technical writer di Data Science con esperienza pratica in data analytics, business intelligence e data science. Scrivo contenuti pratici e orientati al settore su SQL, Python, Power BI, Databricks e data engineering, basati su lavoro di analytics reale. La mia scrittura unisce profondità tecnica e impatto sul business, aiutando i professionisti a trasformare i dati in decisioni sicure.

Domande frequenti su Databricks CREATE TABLE

Qual è lo scopo del comando CREATE TABLE in Databricks?

Il comando CREATE TABLE viene usato per definire una nuova tabella in Databricks, consentendo di specificare lo schema, il formato dei dati e la posizione di archiviazione della tabella.

Qual è la differenza tra tabelle gestite ed esterne?

Le tabelle gestite memorizzano in Databricks sia metadati sia dati, mentre le tabelle esterne memorizzano solo i metadati, lasciando i dati in una posizione esterna.

Una tabella esterna è la stessa cosa di una tabella unmanaged?

Sì, tabella esterna e tabella non gestita (unmanaged) si riferiscono allo stesso concetto in Databricks. Memorizzano i metadati in Databricks ma mantengono i dati effettivi in una posizione esterna, permettendoti di gestire in modo indipendente il ciclo di vita dei dati.

Che differenza c'è tra shallow e deep clone?

Un clone shallow copia solo i metadati, mentre un clone deep duplica sia dati sia metadati.

Cosa sono le tabelle temporanee?

Le tabelle temporanee esistono solo all'interno della sessione corrente e vengono eliminate automaticamente al termine della sessione.

Cos'è l'evoluzione dello schema in Databricks?

L'evoluzione dello schema permette di modificare lo schema di una tabella esistente (ad es. aggiungere o modificare colonne) senza dover ricreare l'intera tabella, il che è particolarmente utile per le tabelle Delta.

Argomenti

Correlato