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
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 Feature
e 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 utilizzatdigest
invece diqdigest
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 valorefirst_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'OPTIMIZE
istruzione eseguita sulla tabella Iceberg utilizzava una WHERE
clausola che includeva una colonna non di partizione nell'espressione di filtro.
Soluzione consigliata: l'OPTIMIZE
istruzione 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(
. Nella versione 3 del motore Athena, questo è stato modificato value
,
base
)log(
in conformità agli standard. SQLbase
,
value
)
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
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/
o tipo di colonna path
/file_name
.parquet 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(
per specificare un tipo di dati per la colonna decimal.precision
,
scale
)
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 |
|
|
Versione 3 del motore Athena:
# | _col0 | _col1 |
---|---|---|
1 |
|
|
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)
emax_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, maSELECT sequence(0,55000,1)
ha esito negativo con il messaggio di erroreIl 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.