Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Cos'è il partizionamento?
Il partizionamento significa organizzare i dati in directory (o «prefissi») su Amazon S3 in base a una particolare proprietà dei dati. Tali proprietà sono chiamate chiavi di partizione. Una chiave di partizione comune è la data o un'altra unità di tempo come l'anno o il mese. Tuttavia, un set di dati può essere partizionato in base a più di una chiave. Ad esempio, i dati sulle vendite di prodotti potrebbero essere suddivisi per data, categoria di prodotto e mercato.
Decidere come partizionare
Elementi adatti a essere utilizzati come chiavi di partizione sono le proprietà che vengono utilizzate sempre o frequentemente nelle query e hanno una cardinalità bassa. Esiste un compromesso tra l'avere troppe partizioni e l'averne troppo poche. Con troppe partizioni, l'aumento del numero di file crea un sovraccarico. Inoltre, il filtraggio delle partizioni stesse comporta un certo sovraccarico. Con un numero insufficiente di partizioni, le query spesso devono scansionare più dati.
Crea una tabella partizionata
Quando un set di dati viene partizionato, puoi creare una tabella partizionata in Athena. Una tabella partizionata è una tabella con chiavi di partizione. Quando utilizzi CREATE
TABLE
, aggiungi delle partizioni alla tabella. Quando utilizzi CREATE TABLE
AS
, le partizioni create su Amazon S3 vengono aggiunte automaticamente alla tabella.
In una dichiarazione CREATE TABLE
, specifica le chiavi di partizione nella clausola PARTITIONED BY (
. In un'istruzione column_name
data_type
)CREATE TABLE
AS
, si specificano le chiavi di partizione in una clausola WITH
(partitioned_by = ARRAY['
o partition_key
'])WITH (partitioning =
ARRAY['
per le tabelle Iceberg. Per motivi di prestazioni, le chiavi di partizione devono essere sempre di tipo partition_key
'])STRING
. Per ulteriori informazioni, consulta Usa string come tipo di dati per le chiavi di partizione.
Per ulteriori dettagli sulla sintassi di CREATE TABLE
e CREATE TABLE AS
, consulta CREATE TABLE e Proprietà tabella CTAS.
Interroga le tabelle partizionate
Quando esegui una query su una tabella partizionata, Athena utilizza i predicati della query per filtrare l'elenco delle partizioni. Quindi utilizza le posizioni delle partizioni corrispondenti per elaborare i file trovati. Athena può ridurre in modo efficiente la quantità di dati analizzati semplicemente non leggendo i dati nelle partizioni che non corrispondono ai predicati delle query.
Esempi
Supponi di avere una tabella partizionata per sales_date
e product_category
e di voler conoscere le entrate totali nell'arco di una settimana in una categoria specifica. Includi i predicati nelle colonne product_category
e sales_date
per assicurarti che Athena analizzi solo la quantità minima di dati, come nell'esempio seguente.
SELECT SUM(amount) AS total_revenue FROM sales WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' AND product_category = 'Toys'
Supponi di avere un set di dati partizionato per data ma che abbia anche un timestamp dettagliato.
Con le tabelle Iceberg, puoi dichiarare che una chiave di partizione ha una relazione con una colonna, ma con le tabelle Hive il motore di query non conosce le relazioni tra colonne e chiavi di partizione. Per questo motivo, è necessario includere un predicato sia sulla colonna che sulla chiave di partizione nella query per assicurarsi che la query non analizzi più dati del necessario.
Ad esempio, supponi che la tabella sales
dell'esempio precedente contenga anche una colonna sold_at
del tipo di dati TIMESTAMP
. Se desideri le entrate solo per un intervallo di tempo specifico, devi scrivere la query in questo modo:
SELECT SUM(amount) AS total_revenue FROM sales WHERE sales_date = '2023-02-28' AND sold_at BETWEEN TIMESTAMP '2023-02-28 10:00:00' AND TIMESTAMP '2023-02-28 12:00:00' AND product_category = 'Toys'
Per ulteriori informazioni su questa differenza tra le query delle tabelle Hive e Iceberg, consulta Come scrivere query per campi timestamp che sono anche partizionati in base all'ora.