Tipi di dati in Amazon Athena - Amazon Athena

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à.

Tipi di dati in Amazon Athena

Quando si esegueCREATE TABLE, si specificano i nomi delle colonne e il tipo di dati che ogni colonna può contenere. Le tabelle create vengono archiviate in AWS Glue Data Catalog.

Per facilitare l'interoperabilità con altri motori di query, Athena utilizza i nomi dei tipi di dati Apache Hive per istruzioni DDL come. CREATE TABLE Per le query DML comeSELECT, eCTAS, INSERT INTO Athena utilizza i nomi dei tipi di dati Trino. La tabella seguente mostra i tipi di dati supportati in Athena. Laddove i tipi DDL e DML differiscono in termini di nome, disponibilità o sintassi, vengono visualizzati in colonne separate.

DDL DML Descrizione
BOOLEAN I valori validi sono true e false.
TINYINT Un intero con segno a 8 bit in formato complementare a due, con un valore minimo di -2 7 e un valore massimo di 2 7 -1.
SMALLINT Un intero con segno a 16 bit in formato complementare a due, con un valore minimo di -2 15 e un valore massimo di 2 15 -1.
INT, INTEGER Un valore con segno a 32 bit in formato complementare a due, con un valore minimo di -2 31 e un valore massimo di 2 31 -1.
BIGINT Un intero con segno a 64 bit in formato complemento a due, con un valore minimo di -2 63 e un valore massimo di 2 63 -1.
FLOAT REAL Un numero a virgola mobile a precisione singola firmato a 32 bit. L'intervallo è compreso tra 1,40129846432481707e-45 e 3,40282346638528860e+38, positivo o negativo. Segue lo standard IEEE per l'aritmetica a virgola mobile (IEEE 754).
DOUBLE Un numero a virgola mobile a doppia precisione firmato a 64 bit. L'intervallo è compreso tra 4,94065645841246544e-324d e 1,79769313486231570e+308d, positivo o negativo. Segue lo standard IEEE per l'aritmetica a virgola mobile (IEEE 754).
DECIMAL (precisione, scala) precisionè il numero totale di cifre. scale(opzionale) è il numero di cifre nella parte frazionaria con un valore predefinito di 0. Ad esempio, è possibile usare il tipo di queste definizioni: decimal(11,5), decimal(15). Il valore massimo per la precisione è 38 mentre il valore massimo per la scala è 38.
CHAR, CHAR (lunghezza)

Dati di caratteri a lunghezza fissa, con una lunghezza specificata compresa tra 1 e 255, come char (10). Se viene specificata la lunghezza, le stringhe vengono troncate alla lunghezza specificata durante la lettura. Se la stringa di dati sottostante è più lunga, la stringa di dati sottostante rimane invariata.

Per ulteriori informazioni, consulta la sezione relativa a tipo di dati Hive CHAR.

STRING VARCHAR Dati di caratteri a lunghezza variabile.
VARCHAR (lunghezza) Dati di caratteri a lunghezza variabile con una lunghezza massima di lettura. Le stringhe vengono troncate alla lunghezza specificata durante la lettura. Se la stringa di dati sottostante è più lunga, la stringa di dati sottostante rimane invariata.
BINARY VARBINARY Dati binari a lunghezza variabile.
TIME Un'ora del giorno con precisione al millisecondo.
Non disponibile ORA (precisione) Un'ora del giorno con una precisione specifica. TIME(3)è equivalente aTIME.
Non disponibile TIME WITH TIME ZONE Un'ora del giorno in un fuso orario. I fusi orari devono essere specificati come offset rispetto all'UTC.
DATE Una data di calendario con anno, mese e giorno.
TIMESTAMP TIMESTAMP, TIMESTAMP SENZA FUSO ORARIO Data e ora del giorno del calendario con precisione al millisecondo.
Non disponibile TIMESTAMP (precisione), TIMESTAMP (precisione) SENZA FUSO ORARIO Una data e un'ora del giorno del calendario con una precisione specifica. TIMESTAMP(3)è equivalente aTIMESTAMP.
Non disponibile TIMESTAMP WITH TIME ZONE Data e ora del giorno del calendario in un fuso orario. I fusi orari possono essere specificati come offset rispetto all'UTC, come nomi di fusi orari IANA o utilizzando UTC, UT, Z o GMT.
Non disponibile TIMESTAMP (PRECISIONE) CON FUSO ORARIO Una data e un'ora del giorno del calendario con una precisione specifica, in un fuso orario.
Non disponibile INTERVAL YEAR TO MONTH Un intervallo di uno o più mesi interi
Non disponibile INTERVAL DAY TO SECOND Un intervallo di uno o più secondi, minuti, ore o giorni
ARRAY< element_type > ARRAY [tipo_elemento] Una matrice di valori. Tutti i valori devono avere lo stesso tipo.
MAP< tipo_chiave, tipo_valore > MAP (tipo_chiave, tipo_valore) Una mappa in cui è possibile cercare i valori per chiave. Tutte le chiavi devono avere lo stesso valore e tutti i valori devono avere lo stesso valore.
STRUCT< field_name_1: field_type_1, field_name_2: field_type_2,... > ROW (nome_campo_1 field_type_1, nome_campo_2 field_type_2,...) Una struttura di dati con campi denominati e relativi valori.
Non disponibile JSON Tipo di valore JSON, che può essere un oggetto JSON, un array JSON, un numero JSON, una stringa JSON o. true false null
Non disponibile UUID Un UUID (Identificatore univoco universale).
Non disponibile INDIRIZZO IP Un indirizzo IPv4 o IPv6.
Non disponibile HyperLogLog Questi tipi di dati supportano funzioni interne approssimative. Per ulteriori informazioni su ciascun tipo, visita il link alla voce corrispondente nella documentazione di Trino.
P4 HyperLogLog
SetDigest
QDigest
TDigest

Esempi di tipi di dati

La tabella seguente mostra esempi di valori letterali per i tipi di dati DML.

Tipo di dati Esempi
BOOLEAN

true

false

TINYINT

TINYINT '123'

SMALLINT

SMALLINT '123'

INT, INTEGER

123456790

BIGINT

BIGINT '1234567890'

2147483648

REAL

'123456.78'

DOUBLE

1.234

DECIMAL (precisione, scala)

DECIMAL '123.456'

CHAR, CHAR (lunghezza)

CHAR 'hello world', CHAR 'hello ''world''!'

VARCHAR, VARCHAR (lunghezza)

VARCHAR 'hello world', VARCHAR 'hello ''world''!'

VARBINARY

X'00 01 02'

TEMPO, TEMPO (precisione)

TIME '10:11:12', TIME '10:11:12.345'

TIME WITH TIME ZONE

TIME '10:11:12.345 -06:00'

DATE

DATE '2024-03-25'

TIMESTAMP, TIMESTAMP SENZA FUSO ORARIO, TIMESTAMP (precisione), TIMESTAMP (precisione) SENZA FUSO ORARIO

TIMESTAMP '2024-03-25 11:12:13', TIMESTAMP '2024-03-25 11:12:13.456'

TIMESTAMP CON FUSO ORARIO, TIMESTAMP (PRECISIONE) CON FUSO ORARIO

TIMESTAMP '2024-03-25 11:12:13.456 Europe/Berlin'

INTERVAL YEAR TO MONTH

INTERVAL '3' MONTH

INTERVAL DAY TO SECOND

INTERVAL '2' DAY

ARRAY [tipo_elemento]

ARRAY['one', 'two', 'three']

MAP (tipo_chiave, tipo_valore)

MAP(ARRAY['one', 'two', 'three'], ARRAY[1, 2, 3])

Nota che le mappe vengono create da una matrice di chiavi e da una matrice di valori.

ROW (field_name_1 field_type_1, field_name_2 field_type_2,...)

ROW('one', 'two', 'three')

Nota che le righe create in questo modo non hanno nomi di colonna. Per aggiungere nomi di colonna, puoi usareCAST, come nell'esempio seguente:

CAST(ROW(1, 2, 3) AS ROW(one INT, two INT, three INT))
JSON

JSON '{"one":1, "two": 2, "three": 3}'

UUID

UUID '12345678-90ab-cdef-1234-567890abcdef'

INDIRIZZO IP

IPADDRESS '10.0.0.1'

IPADDRESS '2001:db8::1'

Considerazioni sui tipi di dati

Limiti di dimensione

Per i tipi di dati che non specificano un limite di dimensione, tieni presente che esiste un limite pratico di 32 MB per tutti i dati in una singola riga. Per ulteriori informazioni, consulta Row or column size limitation in Considerazioni e limitazioni per le SQL query in Amazon Athena.

CHAR e VARCHAR

Un CHAR(n) valore ha sempre un numero di caratteri. n Ad esempio, se si trasmette 'abc' aCHAR(7), vengono aggiunti 4 spazi finali.

I confronti di CHAR valori includono spazi iniziali e finali.

Se viene specificata una lunghezza per CHAR oVARCHAR, le stringhe vengono troncate alla lunghezza specificata durante la lettura. Se la stringa di dati sottostante è più lunga, la stringa di dati sottostante rimane invariata.

Per evitare una virgoletta singola in una CHAR oVARCHAR, usa una virgoletta singola aggiuntiva.

Per eseguire il cast di un tipo di dati non stringa in una stringa in una query DML, VARCHAR esegui il cast sul tipo di dati.

Per utilizzare la substr funzione per restituire una sottostringa di lunghezza specificata da un tipo di CHAR dati, dovete prima eseguire il cast del CHAR valore come. VARCHAR Nell'esempio seguente, col1 utilizza il tipo di CHAR dati.

substr(CAST(col1 AS VARCHAR), 1, 4)

DECIMAL

Per specificare i valori decimali come valori letterali nelle SELECT query, ad esempio quando si selezionano righe con un valore decimale specifico, è possibile specificare il DECIMAL tipo ed elencare il valore decimale come letterale tra virgolette singole nella query, come negli esempi seguenti.

SELECT * FROM my_table WHERE decimal_value = DECIMAL '0.12'
SELECT DECIMAL '44.6' + DECIMAL '77.2'

Utilizzo dei dati con timestamp

Questa sezione descrive alcune considerazioni sull'utilizzo dei dati con timestamp in Athena.

Nota

Il trattamento dei timestamp è leggermente cambiato tra la versione 2 e la versione 3 del motore Athena. Per informazioni sugli errori relativi ai timestamp che possono verificarsi nella versione 3 del motore Athena e sulle soluzioni suggerite, consultare Modifiche al timestamp nei riferimenti Versione 3 del motore Athena.

Formato per la scrittura di dati timestamp su oggetti Amazon S3

Il formato in cui i dati timestamp devono essere scritti negli oggetti Amazon S3 dipende sia dal tipo di dati della colonna che SerDedalla libreria utilizzata.

  • Se hai una colonna di tabella di tipo DATE, Athena si aspetta che la colonna o la proprietà corrispondente dei dati sia una stringa in formato YYYY-MM-DD ISO o un tipo di data integrato come quelli per Parquet o ORC.

  • Se hai una colonna di tabella di tipo TIME, Athena si aspetta che la colonna o la proprietà corrispondente dei dati sia una stringa in formato HH:MM:SS ISO o un tipo di ora integrato come quelli per Parquet o ORC.

  • Se hai una colonna di tabella di tipo TIMESTAMP, Athena si aspetta che la colonna o la proprietà corrispondente dei dati sia una stringa nel formato YYYY-MM-DD HH:MM:SS.SSS (nota lo spazio tra la data e l'ora) o un tipo di ora integrato come quelli per Parquet, ORC o Ion.

    Nota

    I timestamp SerDe OpenCSV sono un'eccezione e devono essere codificati come epoche UNIX con risoluzione in millisecondi.

Come garantire che i dati partizionati nel tempo corrispondano al campo timestamp di un record

Il produttore dei dati deve assicurarsi che i valori della partizione siano allineati con i dati all'interno della partizione. Ad esempio, se i dati hanno una timestamp proprietà e si utilizza Firehose per caricare i dati in Amazon S3, è necessario utilizzare il partizionamento dinamico perché il partizionamento predefinito di Firehose è. wall-clock-based

Usa string come tipo di dati per le chiavi di partizione

Per motivi di prestazioni, è preferibile utilizzare STRING come tipo di dati per le chiavi di partizione. Anche se Athena riconosce i valori delle partizioni nel formato YYYY-MM-DD come date quando si utilizza il tipo DATE, ciò può portare a prestazioni scadenti. Per questo motivo, si consiglia di utilizzare invece il tipo di dati STRING per le chiavi di partizione.

Come scrivere query per campi timestamp che sono anche partizionati in base all'ora

Il modo in cui si scrivono le query per i campi di indicazione temporale che sono partizionati in base all'ora dipende dal tipo di tabella su cui si intende eseguire la query.

Tavoli Hive

Con le tabelle Hive più comunemente utilizzate in Athena, il motore di query non conosce le relazioni tra colonne e chiavi di partizione. Per questo motivo, devi sempre aggiungere predicati nelle tue query sia per la colonna che per la chiave di partizione.

Ad esempio, supponi di avere una colonna event_time e una chiave di partizione event_date e di voler eseguire query sugli eventi tra le 23:00 e le 03:00. In questo caso, è necessario includere i predicati nella query sia per la colonna che per la chiave di partizione, come nell'esempio seguente.

WHERE event_time BETWEEN start_time AND end_time AND event_date BETWEEN start_time_date AND end_time_date

Tavoli Iceberg

Con le tabelle Iceberg, puoi utilizzare valori di partizione calcolati, il che semplifica le tue query. Ad esempio, supponiamo che la tabella Iceberg sia stata creata con una clausola come la seguente: PARTITIONED BY

PARTITIONED BY (event_date month(event_time))

In questo caso, il motore di query elimina automaticamente le partizioni in base ai valori dei predicati event_time. Per questo motivo, la query deve solo specificare un predicato per event_time, come nell'esempio seguente.

WHERE event_time BETWEEN start_time AND end_time

Per ulteriori informazioni, consulta Creazione di tabelle Iceberg.