Versione 3 del motore 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à.

Versione 3 del motore Athena

Per la versione 3 del motore, Athena ha introdotto un approccio di integrazione continua per la gestione del software open source volto a migliorare la simultaneità dei progetti Trino e Presto e ottenere così un accesso più rapido ai miglioramenti da parte della community, integrati e ottimizzati all'interno del motore Athena.

La versione 3 del motore Athena supporta tutte le funzionalità della versione 2. Questo documento evidenzia le principali differenze tra la versione 2 e la versione 3 del motore Athena. Per ulteriori informazioni, consulta l'articolo del Blog sui Big Data di AWS Come fare l'upgrade alla versione 3 del motore Athena per aumentare le prestazioni delle query e accedere a più funzionalità di analisi.

Inizia a usare

Per iniziare, crea un nuovo gruppo di lavoro Athena che utilizza la versione 3 del motore Athena o configura un gruppo di lavoro esistente per l'utilizzo della versione 3. Qualsiasi gruppo di lavoro Athena può eseguire l'aggiornamento dalla versione 2 alla versione 3 del motore, senza compromettere la possibilità di inviare query.

Per ulteriori informazioni, consulta Modifica delle versioni del motore Athena.

Miglioramenti e nuove funzioni

Le caratteristiche e gli aggiornamenti elencati includono sia i miglioramenti apportati da Athena sia le funzionalità incorporate dal progetto open source di Trino. Per un elenco completo degli operatori e delle funzioni di SQL interrogazione, consultate la documentazione di Trino.

Funzionalità aggiunte

Supporto dell'algoritmo del bucket di Apache Spark

Athena può leggere i bucket generati dall'algoritmo hash di Spark. Per specificare che i dati sono stati scritti originariamente dall'algoritmo hash di Spark, inserisci ('bucketing_format'='spark') nella clausola TBLPROPERTIES dell'istruzione CREATE TABLE. Se questa proprietà non viene specificata, si utilizza l'algoritmo hash di Hive.

CREATE EXTERNAL TABLE `spark_bucket_table`( `id` int, `name` string ) CLUSTERED BY (`name`) INTO 8 BUCKETS STORED AS PARQUET LOCATION 's3://amzn-s3-demo-bucket/to/bucketed/table/' TBLPROPERTIES ('bucketing_format'='spark')

Funzioni aggiunte

Le funzioni riportate in questa sezione sono nuove nella versione 3 del motore Athena.

Funzioni di aggregazione

listagg(x, separator): Restituisce i valori di input concatenati, separati dalla stringa del separatore.

SELECT listagg(value, ',') WITHIN GROUP (ORDER BY value) csv_value FROM (VALUES 'a', 'c', 'b') t(value);

Funzioni di array

contains_sequence(x, seq): Restituisce true se la matrice x contiene tutte le sequenze di matrice come sottoinsieme sequenziale (tutti i valori nello stesso ordine consecutivo).

SELECT contains_sequence(ARRAY [1,2,3,4,5,6], ARRAY[1,2]);

Funzioni binarie

murmur3 (binario) — Calcola l'hash 3 a 128 bit MurmurHash del file binario.

SELECT murmur3(from_base64('aaaaaa'));

Funzioni di conversione

format_number(number): Restituisce una stringa formattata utilizzando un simbolo di unità.

SELECT format_number(123456); -- '123K'
SELECT format_number(1000000); -- '1M'

Funzioni di data e ora

timezone_hour(timestamp): Restituisce l'ora della differenza del fuso orario dal timestamp.

SELECT EXTRACT(TIMEZONE_HOUR FROM TIMESTAMP '2020-05-10 12:34:56 +08:35');

timezone_minute(timestamp): Restituisce il minuto della differenza del fuso orario dal timestamp.

SELECT EXTRACT(TIMEZONE_MINUTE FROM TIMESTAMP '2020-05-10 12:34:56 +08:35');

Funzioni geospaziali

to_encoded_polyline(Geometry): codifica una linestring o un multipunto in una polilinea.

SELECT to_encoded_polyline(ST_GeometryFromText( 'LINESTRING (-120.2 38.5, -120.95 40.7, -126.453 43.252)'));

from_encoded_polyline(varchar): decodifica una polilinea in una linestring.

SELECT ST_AsText(from_encoded_polyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@'));

to_geojson_geometry () — Restituisce la geografia sferica specificata in formato Geo. SphericalGeography JSON

SELECT to_geojson_geometry(to_spherical_geography(ST_GeometryFromText( 'LINESTRING (0 0, 1 2, 3 4)')));

from_geojson_geometry (varchar) — Restituisce l'oggetto di tipo geografico sferico dalla rappresentazione Geo, eliminando chiave/valori non geometrici. JSON Featuree FeatureCollection non sono supportati.

SELECT from_geojson_geometry(to_geojson_geometry(to_spherical_geography(ST_GeometryFromText( 'LINESTRING (0 0, 1 2, 3 4)'))));

geometry_nearest_points(Geometry, Geometry): Restituisce i punti di ogni geometria più vicini tra loro. Se una delle due geometrie è vuota, restituisceNULL. In caso contrario, restituisce una riga di due oggetti Point con la distanza minima di due punti qualsiasi sulle geometrie. Il primo punto e il secondo punto provengono rispettivamente dal primo e dal secondo argomento di geometria. Se ci sono più coppie con la stessa distanza minima, una coppia viene scelta arbitrariamente.

SELECT geometry_nearest_points(ST_GeometryFromText( 'LINESTRING (50 100, 50 200)'), ST_GeometryFromText( 'LINESTRING (10 10, 20 20)'));

Funzioni set digest

make_set_digest(x): compone tutti i valori di input di x in un setdigest.

SELECT make_set_digest(value) FROM (VALUES 1, 2, 3) T(value);

Funzioni stringa

soundex(char): Restituisce una stringa di caratteri che contiene la rappresentazione fonetica di char.

SELECT name FROM nation WHERE SOUNDEX(name) = SOUNDEX('CHYNA'); -- CHINA

concat_ws(string0, string1, ..., stringN): Restituisce la concatenazione di string1, string2, ..., stringN utilizzando string0 come separatore. Se string0 è null, allora il valore restituito è null. Negli argomenti, tutti i valori null indicati dopo il separatore vengono ignorati.

SELECT concat_ws(',', 'def', 'pqr', 'mno');

Funzioni finestra

GROUPS— Aggiunge il supporto per i telai delle finestre basati su gruppi.

SELECT array_agg(a) OVER( ORDER BY a ASC NULLS FIRST GROUPS BETWEEN 1 PRECEDING AND 2 FOLLOWING) FROM (VALUES 3, 3, 3, 2, 2, 1, null, null) T(a);

Miglioramenti in termini di prestazioni.

La versione 3 del motore Athena include alcuni miglioramenti in termini di prestazioni, tra cui i seguenti.

  • Recupero più rapido dei metadati delle AWS Glue tabelle: le query che coinvolgono più tabelle ridurranno i tempi di pianificazione delle query.

  • Filtro dinamico per RIGHTJOIN: il filtro dinamico è ora abilitato per i right join con condizioni di uguaglianza, come nell'esempio seguente.

    SELECT * FROM lineitem RIGHT JOIN tpch.tiny.supplier ON lineitem.suppkey = supplier.suppkey WHERE supplier.name = 'abc';
  • Istruzioni preparate di grandi dimensioni: la dimensione predefinita dell'intestazione di HTTP richiesta/risposta è stata aumentata a 2 MB per consentire istruzioni preparate di grandi dimensioni.

  • approx_percentile (): la funzione approx_percentile ora utilizza tdigest invece di qdigest per recuperare valori quantili approssimativi dalle distribuzioni. Ciò si traduce in prestazioni più elevate e un minore utilizzo della memoria. Nota che a seguito di questa modifica, la funzione restituisce risultati diversi rispetto alla versione 2 del motore Athena. Per ulteriori informazioni, consulta La funzione approx_percentile restituisce risultati diversi.

Miglioramenti in termini di affidabilità

L'utilizzo generale della memoria del motore e il monitoraggio nella versione 3 del motore Athena sono stati migliorati. Le query di grandi dimensioni sono meno soggette a errori causati dagli arresti anomali dei nodi.

Miglioramenti in termini di sintassi delle query

INTERSECTALL— Aggiunto supporto per. INTERSECT ALL

SELECT * FROM (VALUES 1, 2, 3, 4) INTERSECT ALL SELECT * FROM (VALUES 3, 4);

EXCEPTALL— Aggiunto il supporto perEXCEPT ALL.

SELECT * FROM (VALUES 1, 2, 3, 4) EXCEPT ALL SELECT * FROM (VALUES 3, 4);

RANGEPRECEDING— Aggiunto il supporto per le funzioni RANGE PRECEDING in finestra.

SELECT sum(x) over (order by x range 1 preceding) FROM (values (1), (1), (2), (2)) t(x);

MATCH_ RECOGNIZE — È stato aggiunto il supporto per la corrispondenza dei modelli di riga, come nell'esempio seguente.

SELECT m.id AS row_id, m.match, m.val, m.label FROM (VALUES(1, 90),(2, 80),(3, 70),(4, 70)) t(id, value) MATCH_RECOGNIZE ( ORDER BY id MEASURES match_number() AS match, RUNNING LAST(value) AS val, classifier() AS label ALL ROWS PER MATCH AFTER MATCH SKIP PAST LAST ROW PATTERN (() | A) DEFINE A AS true ) AS m;

Miglioramenti in termini di formato e tipo di dati

La versione 3 del motore Athena presenta i seguenti miglioramenti in termini di formato e tipo di dati.

  • LZ4e ZSTD — È stato aggiunto il supporto per la lettura LZ4 e la ZSTD compressione dei dati di Parquet. È stato aggiunto il supporto per la scrittura di ZSTD dati compressi. ORC

  • Tabelle basate su collegamenti simbolici: è stato aggiunto il supporto per la creazione di tabelle basate su collegamenti simbolici per file Avro. Di seguito è riportato un esempio.

    CREATE TABLE test_avro_symlink ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' ... INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
  • SphericalGeography— Il SphericalGeography tipo fornisce il supporto nativo per le caratteristiche spaziali rappresentate su coordinate geografiche (a volte chiamate coordinate geodetiche, lat/lon o lon/lat). Le coordinate geografiche sono coordinate sferiche espresse in unità angolari (gradi).

    La funzione to_spherical_geography restituisce le coordinate geografiche (sferiche) a partire da coordinate geometriche (piane), come nell'esempio seguente.

    SELECT to_spherical_geography(ST_GeometryFromText( 'LINESTRING (-40.2 28.9, -40.2 31.9, -37.2 31.9)'));

Modifiche importanti

Quando si esegue la migrazione dalla versione 2 del motore Athena alla versione 3, alcune modifiche possono influire sullo schema della tabella, sulla sintassi o sull'utilizzo del tipo di dati. Questa sezione elenca i messaggi di errore associati e offre alcuni suggerimenti per le soluzioni alternative.

Modifiche alla sintassi delle query

IGNORENULLSnon può essere utilizzato con funzioni di finestra senza valori

Messaggio di errore: Impossibile specificare la clausola di trattamento null per la funzione bool_or.

Causa: ora IGNORE NULLS può essere utilizzato solo con le funzioni di valore first_value, last_value, nth_value, lead e lag. Questa modifica è stata apportata per conformarsi alle ANSI SQL specifiche.

Soluzione consigliata: rimuovi IGNORE NULLS dalle funzioni finestra prive di valori nelle stringhe di query.

CONCATla funzione deve avere due o più argomenti

Messaggio di errore: INVALID_ FUNCTION _ARGUMENT: devono essere presenti due o più argomenti di concatenazione

Causa: in precedenza, la funzione della stringa CONCAT accettava un singolo argomento. Nella versione 3 del motore Athena, la funzione CONCAT richiede un minimo di due argomenti.

Soluzione consigliata: modifica le occorrenze di CONCAT(str) in CONCAT(str, '').

Nella versione 3 del motore Athena, le funzioni non possono avere più di 127 argomenti. Per ulteriori informazioni, consulta Troppi argomenti per la chiamata di funzione.

La funzione approx_percentile restituisce risultati diversi

La funzione approx_percentile restituisce risultati diversi nella versione 3 del motore Athena rispetto alla versione 2 del motore Athena.

Messaggio di errore: nessuno.

Causa: la funzione approx_percentile è soggetta a modifiche di versione.

Importante

Poiché i risultati della funzione approx_percentile sono approssimazioni e le approssimazioni sono soggette a modifiche da una versione all'altra, non è consigliabile fare affidamento sulla funzione approx_percentile per applicazioni critiche.

Soluzione consigliata: per approssimare il comportamento della versione 2 del motore Athena, puoi utilizzare un set diverso di funzioni approx_percentile nella versione 3 del motore Athena. Ad esempio, supponi di avere la seguente query nella versione 2 del motore Athena:

SELECT approx_percentile(somecol, 2E-1)

Per ottenere approssimativamente lo stesso risultato nella versione 3 del motore Athena, puoi provare le funzioni qdigest_agg e value_at_quantile, come nell'esempio seguente. Tieni presente che, anche con questa soluzione alternativa, lo stesso comportamento non è garantito.

SELECT value_at_quantile(qdigest_agg(somecol, 1), 2E-1)

La funzione geospaziale non supporta l'input varbinary

Messaggio di errore: FUNCTION_ _ per st_ NOT FOUND XXX

Causa: alcune funzioni geospaziali non supportano più il tipo di input VARBINARY legacy o le firme delle funzioni correlate al testo.

Soluzione consigliata: utilizza le funzioni geospaziali per convertire i tipi di input in tipi supportati. I tipi di input supportati sono indicati nel messaggio di errore.

Nelle clausole GROUP BY, le colonne annidate devono essere racchiuse tra virgolette

Messaggio di errore:» column_name"."nested_column"deve essere un'espressione aggregata o apparire nella clausola GROUP BY

Causa: la versione 3 del motore Athena richiede che i nomi delle colonne annidate nelle clausole GROUP BY siano tra virgolette doppie. Ad esempio, la seguente query produce l'errore perché, nella clausola GROUP BY, user.name non è tra virgolette.

SELECT "user"."name" FROM dataset GROUP BY user.name

Soluzione consigliata: inserisci le virgolette doppie attorno ai nomi delle colonne annidate nelle clausole GROUP BY, come nell'esempio seguente.

SELECT "user"."name" FROM dataset GROUP BY "user"."name"

FilterNode Errore imprevisto durante l'utilizzo OPTIMIZE su una tabella Iceberg

Messaggio di errore: è stato FilterNoderilevato un imprevisto nel piano; probabilmente il connettore non è stato in grado di gestire WHERE l'espressione fornita.

Causa: l'OPTIMIZEistruzione eseguita sulla tabella Iceberg utilizzava una WHERE clausola che includeva una colonna non di partizione nell'espressione di filtro.

Soluzione consigliata: l'OPTIMIZEistruzione supporta il filtraggio solo per partizioni. Quando esegui OPTIMIZE su tabelle partizionate, includi solo le colonne delle partizioni nella clausola. WHERE Se eseguite OPTIMIZE su una tabella non partizionata, non specificate alcuna clausola. WHERE

Ordine degli argomenti della funzione Log()

Nella versione 2 del motore Athena, l'ordine degli argomenti per la funzione log() era log(value, base). Nella versione 3 del motore Athena, questo è stato modificato log(base, value) in conformità agli standard. SQL

La funzione minute() non supporta gli intervalli anno-mese

Messaggio di errore: Unexpected parameters (interval year to month) for function minute. (Parametri non previsti [intervallo anno-mese] per i minuti della funzione.) Expected: minute(timestamp with time zone) , minute(time with time zone) , minute(timestamp) , minute(time) , minute(interval day to second). (Valori previsti: minute[timestamp with time zone], minute[time with time zone], minute[timestamp], minute[time], minute[interval day to second])

Causa: nella versione 3 del motore Athena, i controlli del tipo sono stati resi più precisi EXTRACT in base alle ANSI SQL specifiche.

Soluzione consigliata: aggiorna le query per assicurarti che i tipi corrispondano alle firme delle funzioni suggerite.

ORDERLe espressioni BY devono apparire nell'elenco SELECT

Messaggio di errore: Perché SELECTDISTINCT, le espressioni ORDER BY devono apparire nell'SELECTelenco

Causa: in una clausola SELECT viene utilizzato un alias di tabella errato.

Soluzione consigliata: verifica che tutte le colonne dell'espressione ORDER BY contengano i riferimenti corretti nella clausola SELECT DISTINCT.

Errore di query durante il confronto di più colonne restituite da una sottoquery

Esempio di messaggio di errore: l'espressione del valore e il risultato della sottoquery devono essere dello stesso tipo: row(varchar, varchar) vs row(row(varchar, varchar))

Causa: A causa di un aggiornamento della sintassi nella versione 3 del motore Athena, questo errore si verifica quando una query tenta di confrontare più valori restituiti da una sottoquery e l'istruzione SELECT della sottoquery racchiude l'elenco di colonne tra parentesi, come nell'esempio seguente.

SELECT * FROM table1 WHERE (t1_col1, t1_col2) IN (SELECT (t2_col1, t2_col2) FROM table2)

Soluzione: nella versione 3 del motore Athena, rimuovi la parentesi attorno all'elenco di colonne nell'istruzione SELECT della sottoquery, come nella seguente query di esempio aggiornata.

SELECT * FROM table1 WHERE (t1_col1, t1_col2) IN (SELECT t2_col1, t2_col2 FROM table2)

SKIPè una parola riservata per le DML interrogazioni

La parola SKIP è ora riservata a DML domande come. SELECT Per utilizzarla SKIP come identificatore in una DML query, racchiudetela tra virgolette doppie.

Per ulteriori informazioni sulle parole riservate in Athena, consulta Evita le parole chiave riservate nelle query.

SYSTEMVERSIONclausole _ TIME e SYSTEM _ obsolete per i viaggi nel tempo

Messaggio di errore: input non corrispondente a '_'. SYSTEM TIME In attesa di: '', 'TIMESTAMP' VERSION

Causa: nella versione 2 del motore Athena, le tabelle Iceberg utilizzavano le clausole FOR SYSTEM_TIME AS OF e FOR SYSTEM_VERSION AS OF per le query temporali su timestamp e versione. La versione 3 del motore Athena utilizza le clausole FOR TIMESTAMP AS OF e FOR VERSION AS OF.

Soluzione consigliata: aggiorna la SQL query per utilizzare le VERSION AS OF clausole TIMESTAMP AS OF and per le operazioni di viaggio nel tempo, come negli esempi seguenti.

Query temporale per timestamp:

SELECT * FROM TABLE FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)

Query temporale per versione:

SELECT * FROM TABLE FOR VERSION AS OF 949530903748831860

Numero di argomenti eccessivo per un costruttore di array

Messaggio di errore: TOO_ MANY _ARGUMENTS: Troppi argomenti per il costruttore di array.

Causa: il numero massimo di elementi in un costruttore di array è ora impostato a 254.

Soluzione consigliata: suddividi gli elementi in più matrici con 254 o meno elementi ciascuna e utilizza la funzione CONCAT per concatenare le matrici, come nell'esempio seguente.

CONCAT( ARRAY[x1,x2,x3...x254], ARRAY[y1,y2,y3...y254], ... )

Identificatore delimitato di lunghezza zero non consentito

Messaggio di errore: Zero-length delimited identifier not allowed. (Identificatore delimitato di lunghezza zero non consentito.)

Causa: una query utilizzava una stringa vuota come alias di colonna.

Soluzione consigliata: aggiorna la query in modo che utilizzi un alias non vuoto per la colonna.

Modifiche a livello di elaborazione dati

Convalida del bucket

Messaggio di errore: HIVE_ _ INVALID BUCKET _FILES: la tabella Hive è danneggiata.

Causa: la tabella potrebbe essere danneggiata. Per garantire la correttezza delle query per le tabelle con periodi fissi, la versione 3 del motore Athena consente una verifica aggiuntiva sulle tabelle con periodi fissi per garantire la correttezza delle query ed evitare errori imprevisti durante il runtime.

Soluzione consigliata: ricrea la tabella utilizzando la versione 3 del motore Athena.

Il casting di una struttura su JSON Now restituisce i nomi dei campi

Quando si esegue il cast di un struct to JSON in una SELECT query in Athena engine versione 3, il cast ora restituisce sia i nomi dei campi che i valori (ad esempio ") useragent":null anziché solo i valori (ad esempio,null).

Modifica dell'applicazione della sicurezza a livello di colonna delle tabelle Iceberg

Messaggio di errore: Access Denied: Cannot select from columns (Accesso negato: impossibile selezionare dalle colonne)

Causa: la tabella Iceberg è stata creata all'esterno di Athena e utilizza una versione di Apache SDK Iceberg precedente alla 0.13.0. Poiché SDK le versioni precedenti non inserivano le colonne in AWS Glue, Lake Formation non era in grado di determinare le colonne autorizzate per l'accesso.

Soluzione consigliata: eseguire un aggiornamento utilizzando l'ALTER TABLE SET TBLPROPERTIESistruzione Athena o utilizzare l'ultimo Iceberg SDK per correggere la tabella e aggiornare le informazioni della colonna. AWS Glue

I valori Null nei tipi di dati List vengono ora propagati a UDFs

Messaggio di errore: Null Pointer Exception (Eccezione del puntatore null)

Causa: questo problema può interessarti se utilizzi il UDF connettore e hai implementato una funzione Lambda definita dall'utente.

La versione 2 del motore Athena ha filtrato i valori null nei tipi di dati elenco che sono stati trasferiti a una funzione definita dall'utente. Nella versione 3 del motore Athena, i nulli vengono ora conservati e trasmessi al. UDF Ciò può causare un'eccezione al puntatore nullo se si UDF tenta di dereferenziare l'elemento nullo senza verificarlo.

Ad esempio, se i dati [null, 1, null, 2, 3, 4] sono presenti in un'origine dei dati come DynamoDB, alla funzione Lambda definita dall'utente vengono tramessi gli elementi seguenti:

Versione 2 del motore Athena: [1,2,3,4]

Versione 3 del motore Athena: [null, 1, null, 2, 3, 4]

Soluzione consigliata: assicurati che la funzione Lambda definita dall'utente gestisca gli elementi null per i tipi di dati elenco.

Le sottostringhe delle matrici di caratteri non contengono più spazi riempiti

Messaggio di errore: non viene generato alcun errore, ma la stringa restituita non contiene più spazi riempiti. Ad esempio, substr(char[20],1,100) ora restituisce una stringa con lunghezza 20 anziché 100.

Soluzione consigliata: non è richiesta alcuna azione.

Coercizione del tipo di colonna decimale non supportata

Messaggi di errore: HIVE _ CURSOR _: Impossibile leggere il file ERROR Parquet: s3://amzn-s3-demo-bucket/path/file_name.parquet o tipo di colonna non supportato (varchar) per la colonna Parquet ([column_name]

Causa: la versione 2 del motore Athena ha avuto successo occasionalmente (ma spesso ha avuto esito negativo) nel tentativo di coercizione dei tipi di dati da varchar al numero decimale. Poiché la versione 3 del motore Athena dispone di una convalida del tipo che verifica che questo sia compatibile prima di provare a leggere il valore, questi tentativi di coercizione ora falliscono sempre.

Soluzione consigliata: sia per Athena engine versione 2 che per Athena engine versione 3, modificate lo schema in modo AWS Glue da utilizzare un tipo di dati numerico anziché varchar per le colonne decimali nei file Parquet. Scansiona nuovamente i dati e assicurati che il nuovo tipo di dati della colonna sia di tipo decimale oppure ricrea manualmente la tabella in Athena e usa la sintassi decimal(precision, scale) per specificare un tipo di dati per la colonna decimal.

I valori Float o double NaN non possono più essere convertiti a bigint

Messaggio di errore: INVALID_ CAST _ARGUMENT: Impossibile trasmettere real/double NaN a bigint

Causa: nella versione 3 del motore Athena, NaN non può più convertire a 0 come bigint.

Soluzione consigliata: assicurati che i valori NaN non siano presenti nelle colonne float o double quando converti in bigint.

modifica del tipo di ritorno della funzione uuid ()

Il problema seguente riguarda sia le tabelle che le viste.

Messaggio di errore: Tipo di Hive non supportato: uuid

Causa: nella versione 2 del motore Athena, la uuid() funzione restituiva una stringa, ma nella versione 3 del motore Athena restituisce uno pseudo generato casualmente (tipo 4). UUID Poiché il tipo di dati della UUID colonna non è supportato in Athena, la uuid() funzione non può più essere utilizzata direttamente nelle CTAS query per generare colonne UUID in Athena engine versione 3.

Ad esempio, la seguente CREATE TABLE istruzione viene completata correttamente nella versione 2 del motore Athena ma NOTrestituisce SUPPORTED _: Unsupported Hive type: uuid nella versione 3 del motore Athena:

CREATE TABLE uuid_table AS SELECT uuid() AS myuuid

Analogamente, la seguente istruzione CREATE VIEW viene completata correttamente nella versione 2 del motore Athena ma restituisce Tipo di colonna non valido per la colonna myuuid: Tipo di Hive non supportato: uuid nella versione 3 del motore Athena:

CREATE VIEW uuid_view AS SELECT uuid() AS myuuid

Quando su una visualizzazione così creata nella versione 2 del motore Athena viene eseguita una query nella versione 3 del motore Athena, si verifica un errore simile al seguente:

VIEW_IS_STALE: riga 1:15: La vista 'awsdatacatalog.mydatabase.uuid_view' è obsoleta o in uno stato non valido: la colonna [myuuid] di tipo uuid proiettata dalla visualizzazione della query nella posizione 0 non può essere forzata alla colonna [myuuid] di tipo varchar memorizzata nella definizione della vista

Soluzione consigliata: quando crei la tabella o la visualizzazione, utilizza la funzione cast() per convertire l'output di uuid() in varchar, come negli esempi seguenti:

CREATE TABLE uuid_table AS SELECT CAST(uuid() AS VARCHAR) AS myuuid
CREATE VIEW uuid_view AS SELECT CAST(uuid() AS VARCHAR) AS myuuid

CHARe VARCHAR problemi di coercizione

Usa le soluzioni alternative in questa sezione se riscontri problemi di coercizione con varchar e char nella versione 3 del motore Athena. Se non riesci a utilizzare queste soluzioni alternative, contatta. AWS Support

CONCATerrore di funzione con ingressi misti e CHAR VARCHAR

Problema: la seguente query ha esito positivo sulla versione 2 del motore Athena.

SELECT concat(CAST('abc' AS VARCHAR(20)), '12', CAST('a' AS CHAR(1)))

Tuttavia, nella versione 3 del motore Athena, la stessa query ha esito negativo con quanto segue:

Messaggio di errore: FUNCTION_ NOT _FOUND: riga 1:8: Parametri imprevisti (varchar (20), varchar (2), char (1)) per la funzione concat. Previsto: concat(char(x), char(y)), concat(array(E), E) E, concat(E, array(E)) E, concat(array(E)) E, concat(varchar), concat(varbinary)

Soluzione consigliata: quando utilizzi la funzione concat, converti su char o varchar, ma non su una combinazione di entrambi.

SQLCHARVARCHAR|| errore di concatenazione con e input

Nella versione 3 del motore Athena, l'operatore di concatenazione || a doppia barra verticale richiede input come input varchar. Gli input non possono essere una combinazione di tipi varchar e char.

Messaggio di errore: TYPE_ NOT _: riga 1:26FOUND: Tipo sconosciuto: char (65537)

Causa: una query che utilizza || per concatenare char e varchar può generare l'errore, come nell'esempio seguente.

SELECT CAST('a' AS CHAR) || CAST('b' AS VARCHAR)

Soluzione consigliata: concatena varchar con varchar, come nell'esempio seguente.

SELECT CAST('a' AS VARCHAR) || CAST('b' AS VARCHAR)
CHARe errore di interrogazione VARCHAR UNION

Messaggio di errore: NOT_SUPPORTED: Tipo di hive non supportato: char (65536). CHARTipi supportati: (<=255) CHAR

Causa: una query che tenta di combinare char e varchar, come nell'esempio seguente:

CREATE TABLE t1 (c1) AS SELECT CAST('a' as CHAR) as c1 UNION ALL SELECT CAST('b' AS VARCHAR) AS c1

Soluzione consigliata: nella query di esempio, converti 'a' come varchar anzichéchar.

Spazi vuoti indesiderati dopo CHAR o coercizione VARCHAR

Nella versione 3 del motore Athena, quando i dati di char(X) e varchar vengono forzati a un unico tipo quando formano una matrice o una singola colonna, char(65535) è il tipo di destinazione e ogni campo contiene molti spazi finali indesiderati.

Causa: la versione 3 del motore Athena costringe varchar e char(X) a char(65535), quindi riempe a destra i dati con spazi.

Soluzione consigliata: converti esplicitamente ogni campo in varchar.

Modifiche al timestamp

Modifica del comportamento durante la trasmissione di un timestamp con fuso orario varchar

Nella versione 2 del motore Athena, la trasmissione di un Timestamp con fuso orario varchar causava la modifica di alcuni valori letterali del fuso orario (ad esempio, US/Eastern modificato in America/New_York). Questo comportamento non si verifica nella versione 3 del motore Athena.

L'overflow del timestamp della data genera un errore

Messaggio di errore: Millis overflow: XXX

Causa: poiché nella versione 2 del motore Athena non è stato verificato l'eventuale sovraccarico delle date ISO 8601, alcune date hanno prodotto un timestamp negativo. La versione 3 del motore Athena verifica la presenza di questo overflow e genera un'eccezione.

Soluzione consigliata: assicurati che il timestamp sia compreso nell'intervallo.

Fusi orari politici non supportati TIME

Messaggio di errore: INVALIDLITERAL

Causa: query come SELECT TIME '13:21:32.424 America/Los_Angeles'.

Soluzione consigliata: evita di utilizzare fusi orari politici con TIME.

La mancata corrispondenza di precisione nelle colonne Timestamp causa un errore di serializzazione

Messaggio di errore: SERIALIZATION _ERROR: impossibile serializzare la colonna 'COLUMNZ'di tipo 'timestamp (3)' nella posizione X:Y

COLUMNZ è il nome di output della colonna che causa il problema. I numeri X:Y indica la posizione della colonna nell'output.

Causa: la versione 3 del motore Athena verifica che la precisione dei timestamp nei dati corrisponda a quella specificata per il tipo di dati della colonna nelle specifiche della tabella. Attualmente, questa precisione è sempre pari a 3. Se i dati hanno una precisione maggiore, le query hanno esito negativo e viene restituito l'errore.

Soluzione consigliata: controlla i dati per assicurarti che i timestamp abbiano una precisione al millisecondo.

Precisione del timestamp errata nelle CTAS query UNLOAD e nelle tabelle Iceberg

Messaggio di errore: precisione del timestamp errata per il timestamp (6); la precisione configurata è MILLISECONDS

Causa: la versione 3 del motore Athena verifica che la precisione dei timestamp nei dati corrisponda a quella specificata per il tipo di dati della colonna nelle specifiche della tabella. Attualmente, questa precisione è sempre pari a 3. Se i dati hanno una precisione maggiore di questa (ad esempio, microsecondi anziché millisecondi), le query possono avere esito negativo con l'errore rilevato.

Soluzione: per risolvere questo problema, impostate innanzitutto CAST la precisione del timestamp su 6, come nell'CTASesempio seguente che crea una tabella Iceberg. Nota che la precisione deve essere specificata come 6 anziché 3 per evitare l'errore Precisione (3) timestamp non supportata per Iceberg.

CREATE TABLE my_iceberg_ctas WITH (table_type = 'ICEBERG', location = 's3://amzn-s3-demo-bucket/table_ctas/', format = 'PARQUET') AS SELECT id, CAST(dt AS timestamp(6)) AS "dt" FROM my_iceberg

Quindi, poiché Athena non supporta il timestamp 6, converti nuovamente il valore in timestamp (ad esempio, in una visualizzazione). Il seguente esempio crea una visualizzazione dalla tabella my_iceberg_ctas.

CREATE OR REPLACE VIEW my_iceberg_ctas_view AS SELECT cast(dt AS timestamp) AS dt FROM my_iceberg_ctas

La lettura del tipo Long come Timestamp o viceversa nei ORC file ora causa un errore di file non valido ORC

Messaggio di errore: errore nell'apertura del file 'FILE(SPLITPOSITION)' non valido di Hive split. ORC Impossibile leggere il SQL tipo timestamp dallo ORC stream .long_type of type LONG

Causa: la versione 3 del motore Athena ora rifiuta la coercizione implicita dal tipo di dati Long a Timestamp o da Timestamp a Long. In precedenza, i valori Long venivano convertiti implicitamente in timestamp come se fossero millisecondi di epoca.

Soluzione consigliata: utilizza la funzione from_unixtime per trasmettere in modo esplicito la colonna o utilizza la funzione from_unixtime per creare una colonna aggiuntiva per le query future.

Ora e intervallo anno-mese non supportati

Messaggio di errore: TYPEMISMATCH

Causa: la versione 3 del motore Athena non supporta l'ora e l'intervallo anno-mese (ad esempio, SELECT TIME '01:00' + INTERVAL '3' MONTH).

Overflow del timestamp per il formato Parquet int96

Messaggio di errore: Nanos non valido timeOfDay

Causa: overflow del timestamp per il formato Parquet int96.

Soluzione consigliata: identifica i file specifici che presentano il problema. Quindi genera nuovamente il file di dati con una up-to-date libreria Parquet ben nota o usa AthenaCTAS. Se il problema persiste, contatta l'assistenza di Athena indicando il modo in cui vengono generati i file di dati.

Spazio richiesto tra i valori di data e ora per la conversione da una stringa a un timestamp

Messaggio di errore: INVALID_ CAST _ARGUMENT: Il valore non può essere trasmesso al timestamp.

Causa: la versione 3 del motore Athena non accetta più un trattino come separatore valido tra i valori di data e ora nella stringa di input di cast. Ad esempio, la seguente query funziona nella versione 2 del motore Athena ma non nella versione 3 del motore Athena:

SELECT CAST('2021-06-06-23:38:46' AS timestamp) AS this_time

Soluzione consigliata: nella versione 3 del motore Athena, sostituisci il trattino tra la data e l'ora con uno spazio, come nell'esempio seguente.

SELECT CAST('2021-06-06 23:38:46' AS timestamp) AS this_time

modifica del valore di ritorno del timestamp to_iso8601 ()

Messaggio di errore: nessuno

Causa: nella versione 2 del motore Athena, la funzione to_iso8601 restituisce un timestamp con fuso orario anche se il valore passato alla funzione non include il fuso orario. Nella versione 3 del motore Athena, la funzione to_iso8601 restituisce un timestamp con fuso orario solo quando l'argomento passato include il fuso orario.

Ad esempio, la seguente query passa la data corrente alla funzione to_iso8601 due volte: prima come timestamp con fuso orario e poi come timestamp.

SELECT TO_ISO8601(CAST(CURRENT_DATE AS TIMESTAMP WITH TIME ZONE)), TO_ISO8601(CAST(CURRENT_DATE AS TIMESTAMP))

L'output seguente mostra il risultato della query in ogni motore.

Versione 2 del motore Athena:

# _col0 _col1
1

2023-02-24T00:00:00.000Z

2023-02-24T00:00:00.000Z

Versione 3 del motore Athena:

# _col0 _col1
1

2023-02-24T00:00:00.000Z

2023-02-24T00:00:00.000

Soluzione consigliata: per replicare il comportamento precedente, puoi passare il valore del timestamp alla funzione with_timezone prima di passarlo ato_iso8601, come nell'esempio seguente:

SELECT to_iso8601(with_timezone(TIMESTAMP '2023-01-01 00:00:00.000', 'UTC'))

Risultato

# _col0
1 2023-01-01T00:00:00.000Z

at_timezone () il primo parametro deve specificare una data

Problema: nella versione 3 del motore Athena, la funzione at_timezone non può assumere un valore time_with_timezone come primo parametro.

Causa: senza informazioni sulla data, non è possibile determinare se il valore passato è l'ora legale o l'ora solare. Ad esempio, at_timezone('12:00:00 UTC', 'America/Los_Angeles') è ambiguo poiché non è possibile determinare se il valore passato è Pacific Daylight Time (PDT) o Pacific Standard Time (). PST

Limitazioni

La versione 3 del motore Athena presenta le limitazioni seguenti.

  • Prestazioni delle query: molte query vengono eseguite più velocemente sulla versione 3 del motore Athena, ma alcuni piani di query possono differire dalla versione 2. Di conseguenza, alcune query possono differire in termini di latenza o costi.

  • Connettori Trino e Presto: i connettori Trino e Presto non sono supportati. Utilizzare Amazon Athena Federated Query per collegare le origini dati. Per ulteriori informazioni, consulta Usa Amazon Athena Federated Query.

  • Esecuzione a tolleranza di errore: l'esecuzione a tolleranza di errore di Trino (Trino Tardigrade) non è supportata.

  • Limite dei parametri della funzione: le funzioni non possono richiedere più di 127 parametri. Per ulteriori informazioni, consulta Troppi argomenti per la chiamata di funzione.

I seguenti limiti sono stati introdotti nella versione 2 del motore Athena per garantire che le query non abbiano esito negativo a causa di limitazioni di risorse. Questi limiti non sono configurabili dagli utenti.

  • Numero degli elementi del risultato— Il numero di elementi del risultato n è limitato a 10.000 o meno per le seguenti funzioni: min(col, n), max(col, n), min_by(col1, col2, n) e max_by(col1, col2, n).

  • GROUPINGSETS— Il numero massimo di sezioni in un set di raggruppamento è 2048.

  • Lunghezza massima della riga del file di testo: la lunghezza massima della riga predefinita per i file di testo è 200 MB.

  • Dimensione massima del risultato della funzione di sequenza — La dimensione massima del risultato di una funzione di sequenza è 50.000 voci. Ad esempio, SELECT sequence(0,45000,1) ha esito positivo, ma SELECT sequence(0,55000,1) ha esito negativo con il messaggio di errore Il risultato della funzione di sequenza non deve avere più di 50.000 voci. Questo limite è valido per tutti i tipi di input per funzioni di sequenza, inclusi i le marche temporali.