Versión 2 del motor Athena
La versión 2 del motor de Athena presenta los siguientes cambios.
Mejoras y nuevas características
-
EXPLAIN y EXPLAIN ANALYZE: puede utilizar la instrucción
EXPLAIN
en Athena para ver el plan de ejecución de las consultas SQL. UtiliceEXPLAIN ANALYZE
para ver el plan de ejecución distribuido y el costo de cada operación de las consultas SQL. Para obtener más información, consulte Uso de EXPLAIN y EXPLAIN ANALYZE en Athena. -
Consultas federadas: en la versión 2 del motor Athena se admiten las consultas federadas. Para obtener más información, consulte Uso de consulta federada de Amazon Athena.
-
Funciones geoespaciales: se han agregado más de 25 funciones geoespaciales. Para obtener más información, consulte Nuevas funciones geoespaciales en la versión 2 del motor Athena.
-
Esquema anidado: se ha agregado compatibilidad para leer el esquema anidado, lo que reduce el costo.
-
Instrucciones preparadas: utilice instrucciones preparadas para la ejecución repetida de la misma consulta con parámetros de consulta diferentes. Una instrucción preparada contiene parámetros de marcador de posición cuyos valores se pasan en tiempo de ejecución. Las instrucciones preparadas ayudan a prevenir los ataques de inyección SQL. Para obtener más información, consulte Uso de consultas parametrizadas.
-
Compatibilidad con la evolución del esquema: se ha agregado compatibilidad con evolución de esquemas para datos en formato Parquet.
-
Se agregó compatibilidad para leer columnas de matriz, mapa o fila de particiones donde el esquema de partición es diferente del esquema de tabla. Esto puede suceder cuando el esquema de tabla se actualizó después de crear la partición. Los tipos de columna modificados deben ser compatibles. Para los tipos de fila, es posible agregar o eliminar campos finales, pero los campos correspondientes (por ordinal) deben tener el mismo nombre.
-
Los archivos ORC ahora pueden tener columnas de estructura con campos faltantes. Esto permite cambiar el esquema de tabla sin volver a escribir los archivos ORC.
-
Las columnas de estructura ORC ahora se asignan por nombre en lugar de ordinal. Esto maneja adecuadamente los campos de estructura faltantes o adicionales en el archivo ORC.
-
-
SQL OFFSET: la cláusula
OFFSET
de SQL ahora es compatible con las instruccionesSELECT
. Para obtener más información, consulte SELECT. -
Instrucción UNLOAD: puede utilizar la instrucción
UNLOAD
para escribir la salida de una consultaSELECT
en los formatos PARQUET, ORC, AVRO y JSON. Para obtener más información, consulte UNLOAD.
Mejoras de agrupación, unión y subconsulta
-
Agrupación compleja: se ha agregado compatibilidad con operaciones de agrupación complejas.
-
Subconsultas correlacionadas: se agregó compatibilidad para subconsultas correlacionadas en
IN
y para subconsultas correlacionadas que requieren coerciones. -
Combinación cruzada: se ha agregado compatibilidad para
CROSS JOIN
en tablas derivadasLATERAL
. -
Conjuntos de agrupación: se ha agregado compatibilidad para cláusulas
ORDER BY
en agregaciones para consultas que utilizanGROUPING SETS
. -
Expresiones de Lambda: se agregó compatibilidad para desreferenciar campos de fila en expresiones Lambda.
-
Valores nulos en semiuniones: se agregó compatibilidad para valores nulos en el lado izquierdo de una semiunión (es decir, un predicado
IN
con subconsultas). -
Combinaciones espaciales: se agregó compatibilidad para uniones espaciales de difusión y uniones espaciales izquierdas.
-
Vertido en disco: para operaciones
INNER JOIN
yLEFT JOIN
de uso intensivo de memoria, Athena descarga los resultados de la operación intermedia en el disco. Esto permite la ejecución de consultas que requieren grandes cantidades de memoria.
Mejoras de los tipos de datos
-
INT para INTEGER: se ha agregado compatibilidad para
INT
como alias para el tipo de datosINTEGER
. -
Tipos de intervalo: se ha agregado compatibilidad para conversión a tipos
INTERVAL
. -
IPADDRESS: se ha agregado un nuevo tipo
IPADDRESS
para representar direcciones IP en consultas DML. Se ha agregado compatibilidad de conversión entre tipoVARBINARY
yIPADDRESS
. El tipoIPADDRESS
no se reconoce en las consultas DDL. -
Es diferente de: se ha agregado compatibilidad
IS DISTINCT FROM
con tiposJSON
yIPADDRESS
. -
Verificaciones de igualdad nulas: ya son compatibles las verificaciones de igualdad para valores nulos en estructuras de datos
ARRAY
,MAP
yROW
. Por ejemplo, la expresiónARRAY ['1', '3', null] = ARRAY ['1', '2', null]
devuelvefalse
. Anteriormente, un elemento nulo devolvía el mensaje de errorComparación no compatible
. -
Coerción de tipo de fila: ahora se permite la coerción entre tipos de filas independientemente de los nombres de campo. Anteriormente, un tipo de fila era coercible a otro solo si el nombre del campo del tipo de origen coincidía con el tipo de destino o cuando el tipo de destino tenía un nombre de campo anónimo.
-
Resta de tiempo: resta implementada para todos los tipos
TIME
yTIMESTAMP
. -
Unicode: se agregó compatibilidad para secuencias Unicode de escape en literales de cadena.
-
Concatenación VARBINARY: se ha agregado compatibilidad con concatenación de valores
VARBINARY
.Funciones de valor de ventana: las funciones de valor de ventana ahora son compatibles con
IGNORE NULLS
yRESPECT NULLS
.
Tipos de entrada adicionales para funciones
Las siguientes funciones ahora aceptan tipos de entrada adicionales. Para obtener más información acerca de cada función, visite el enlace correspondiente a la documentación de Presto.
-
approx_distinct(): la función approx_distinct()
admite ahora los siguientes tipos: INTEGER
,SMALLINT
,TINYINT
,DECIMAL
,REAL
,DATE
,TIMESTAMP
,TIMESTAMP WITH TIME ZONE
,TIME
,TIME WITH TIME ZONE
,IPADDRESS
yCHAR
. -
Avg(), sum(): las funciones de agregación avg()
y sum() ahora son compatibles con el tipo de datos INTERVAL
. -
Lpad(), rpad(): las funciones lpad
y rpad ahora funcionan en entradas VARBINARY
. -
Min(), max(): las funciones de agregación min()
y max() ahora permiten tipos de entrada desconocidos en el momento del análisis de consultas para que pueda utilizar las funciones con literales NULL
. -
regexp_replace(): variante de la función regexp_replace()
que puede ejecutar una función de Lambda para cada reemplazo. -
Sequence(): se agregaron variantes
DATE
de la función sequence(), incluida la variante con un incremento implícito de paso de un día. -
ST_Area(): la función geoespacial ST_Area()
ahora admite todos los tipos de geometría. -
Substr(): la función substr
ahora funciona en entradas VARBINARY
. -
zip_with(): ahora se pueden usar las matrices de longitud no coincidente con zip_with()
. Las posiciones faltantes se rellenan con nulo. Anteriormente, cuando se pasaban matrices de diferentes longitudes, se generaba un error. Este cambio puede dificultar la distinción entre los valores que originalmente eran nulos de los valores que se agregaron para rellenar las matrices con la misma longitud.
Funciones agregadas
La siguiente lista contiene funciones nuevas desde la versión 2 del motor Athena. La lista no incluye funciones geoespaciales. Para obtener una lista de funciones geoespaciales, consulte Nuevas funciones geoespaciales en la versión 2 del motor Athena.
Para obtener más información acerca de cada función, visite el enlace correspondiente a la documentación de Presto.
Funciones de agregación
Funciones y operadores de matriz
array_sort()
Funciones binarias y operadores
Funciones y operadores de fecha y hora
Funciones y operadores de mapa
Funciones y operadores matemáticos
Funciones de resumen de cuantiles
Funciones de resumen de cuantilesqdigest
agregado.
Funciones y operadores de cadena
Mejoras en el rendimiento
En la versión 2 del motor Athena, se ha mejorado el rendimiento de las siguientes características.
Rendimiento de las consultas
-
Rendimiento de uniones de difusión: se mejoró el rendimiento de las uniones de difusión mediante la aplicación de la eliminación de particiones dinámica en el nodo de trabajo.
-
Tablas en buckets: rendimiento mejorado para escribir en tablas en buckets cuando los datos que se escriben ya están particionados de forma adecuada (por ejemplo, cuando la salida es de una unión en bucket).
-
DISTINCT: rendimiento mejorado para algunas consultas que utilizan
DISTINCT
.Filtrado dinámico y poda de particiones: las mejoras aumentan el rendimiento y reducen la cantidad de datos analizados en las consultas.
-
Operaciones de filtrado y proyección: ahora las operaciones de filtrado y proyección se procesan siempre por columnas, de ser posible. El motor aprovecha automáticamente las codificaciones de diccionario cuando es eficaz.
-
Intercambios de recopilación: rendimiento mejorado para consultas con intercambio de recopilación.
-
Agregaciones globales: rendimiento mejorado para algunas consultas que realizan agregaciones globales filtradas.
-
Conjuntos de agrupación, cube, rollup: rendimiento mejorado para consultas que implican
GROUPING SETS
,CUBE
oROLLUP
, que puede utilizar para agregar varios conjuntos de columnas en una sola consulta. -
Filtros altamente selectivos: se ha mejorado el rendimiento de las consultas con filtros altamente selectivos.
-
Operaciones JOIN y AGGREGATE: se ha mejorado el rendimiento de las operaciones
JOIN
yAGGREGATE
. -
Like: se ha mejorado el rendimiento de las consultas que utilizan predicados
LIKE
en las columnas de tablasinformation_schema
. -
Ordenar por y límite: planes, rendimiento y uso de memoria mejorados para las consultas que implican
ORDER BY
yLIMIT
para evitar intercambios de datos innecesarios. -
Ordenar por: las operaciones
ORDER BY
ahora se distribuyen de forma predeterminada, lo que permite el uso de cláusulasORDER BY
más extensas. -
Conversiones de tipo fila: rendimiento mejorado al convertir entre tipos de
ROW
. -
Tipos estructurales: rendimiento mejorado de consultas que procesan tipos estructurales y contienen análisis, uniones, agregaciones o escrituras de tablas.
-
Análisis de tablas: se presentó una nueva regla de optimización para evitar análisis de tablas duplicados en determinados casos.
-
Unión: se ha mejorado el rendimiento de consultas
UNION
.
Rendimiento de planificación de consultas
-
Rendimiento de la planificación: se ha mejorado el rendimiento de la planificación de consultas que unen varias tablas con un gran número de columnas.
-
Evaluaciones de predicados: mejora del rendimiento de la evaluación de predicados durante la inserción de predicados en la planificación.
-
Compatibilidad de inserción de predicados para conversión: compatibilidad de inserción de predicados para el predicado
<column>
IN
<values list>
donde los valores de la lista de valores requieren conversión para que coincidan con el tipo de columna. -
Inferencia e inserción de predicados: inferencia e inserción de predicados extendidos para consultas que utilizan un predicado
<symbol>
IN
<subquery>
. -
Tiempos de espera: se corrigió un error que, en raras ocasiones, podía provocar tiempos de espera de planificación de consultas.
Rendimiento de uniones
-
Uniones con columnas de mapa: se ha mejorado el rendimiento de las uniones y agregaciones que incluyen columnas de mapa.
-
Uniones solo con condiciones de no igualdad: se ha mejorado el rendimiento de uniones solo con condiciones de no igualdad mediante el uso de una unión de bucle anidado en lugar de una unión hash.
-
Uniones externas: el tipo de distribución de unión ahora se selecciona automáticamente para las consultas que involucran uniones externas.
-
Uniones de rango sobre una función: rendimiento mejorado de uniones donde la condición es un rango sobre una función (por ejemplo,
a JOIN b ON b.x < f(a.x) AND b.x > g(a.x)
). -
Vertido en disco: se corrigieron errores relacionados con el vertido de disco y problemas de memoria para mejorar el rendimiento y reducir los errores de memoria en operaciones
JOIN
.
Rendimiento de subconsultas
-
Subconsultas correlacionadas: se ha mejorado el rendimiento de subconsultas
EXISTS
correlacionadas. -
Subconsultas correlacionadas con igualdad: se ha mejorado la compatibilidad para subconsultas correlacionadas que contienen predicados de igualdad.
-
Subconsultas correlacionadas con desigualdades: rendimiento mejorado para subconsultas correlacionadas que contienen desigualdades.
-
Agregaciones count(*) sobre subconsultas: se ha mejorado el rendimiento de agregaciones
count(*)
sobre subconsultas con cardinalidad constante conocida. -
Propagación de filtro de consulta externa: rendimiento mejorado de subconsultas correlacionadas cuando los filtros de la consulta externa se pueden propagar a la subconsulta.
Rendimiento de funciones
-
Funciones de agregación de ventana: mejora del rendimiento de las funciones de agregación de ventana.
-
element_at(): se ha mejorado el rendimiento de
element_at()
para que los mapas sean de tiempo constante en lugar de proporcionales al tamaño del mapa. -
Grouping(): rendimiento mejorado para consultas que implican
grouping()
. -
JSON casting: se ha mejorado el rendimiento de la conversión de
JSON
a tiposARRAY
oMAP
. -
Funciones de devolución de mapas: rendimiento mejorado de las funciones que devuelven mapas.
-
Conversión mapa a mapa: se ha mejorado el rendimiento de la conversión de mapa a mapa.
-
Min() y max(): se han optimizado las funciones
min()
ymax()
para evitar la creación innecesaria de objetos, lo que reduce la sobrecarga de recopilación de elementos no utilizados. -
row_number(): rendimiento y uso de memoria mejorados para las consultas que utilizan
row_number()
seguido de un filtro en los números de fila generados. -
Funciones de ventana: rendimiento mejorado de consultas que contienen funciones de ventana con cláusulas
PARTITION BY
yORDER BY
idénticas. -
Funciones de ventana: mejora del rendimiento de ciertas funciones de ventana (por ejemplo,
LAG
) que tienen especificaciones similares.
Rendimiento geoespacial
-
Serialización de geometría: se ha mejorado el rendimiento de serialización de los valores de geometría.
-
Funciones geoespaciales: se ha mejorado el rendimiento de
ST_Intersects()
,ST_Contains()
,ST_Touches()
,ST_Within()
,ST_Overlaps()
,ST_Disjoint()
,transform_values()
,ST_XMin()
,ST_XMax()
,ST_YMin()
,ST_YMax()
,ST_Crosses()
yarray_intersect()
. -
ST_Distance(): mejora del rendimiento de las consultas de unión que involucran la función
ST_Distance()
. -
ST_Intersection(): se ha optimizado la función
ST_Intersection()
para rectángulos alineados con ejes de coordenadas (por ejemplo, polígonos producidos por las funcionesST_Envelope()
ybing_tile_polygon()
).
Mejoras relacionadas con JSON
Funciones de mapa
-
Se ha mejorado el rendimiento del subíndice de mapa de
O(n)
aO(1)
en todos los casos. Anteriormente, únicamente los mapas producidos por ciertas funciones y lectores aprovechaban esta mejora. -
Se han agregado las funciones
map_from_entries()
ymap_entries()
.
Conversión
-
Se ha agregado la capacidad de convertir
JSON
desdeREAL
,TINYINT
oSMALLINT
. -
Ahora puede convertir
JSON
aROW
incluso si elJSON
no contiene todos los campos delROW
. -
Se mejoró el rendimiento de
CAST(json_parse(...) AS ...)
. -
Se ha mejorado el rendimiento de la conversión de
JSON
a tiposARRAY
oMAP
.
Nuevas funciones JSON
Cambios bruscos
Los cambios sustanciales incluyen correcciones de errores, cambios en las funciones geoespaciales, funciones reemplazadas y la introducción de límites. Las mejoras en la conformidad de ANSI SQL pueden interrumpir las consultas que dependían del comportamiento no estándar.
Correcciones de errores
Los siguientes cambios corrigen problemas de comportamiento que provocaron que las consultas se ejecutaran correctamente, pero con resultados inexactos.
-
Las columnas fixed_len_byte_array de parquet ahora se aceptan como DECIMALES: las consultas sobre columnas de Parquet de tipo
fixed_len_byte_array
se realizan correctamente y devuelven valores correctos si se anotan comoDECIMAL
en el esquema de Parquet. Las consultas en columnasfixed_len_byte_array
sin la anotaciónDECIMAL
fallan con un error. Anteriormente, las consultas en columnasfixed_len_byte_array
sin la anotación decimal se realizaban correctamente, pero devolvían valores incomprensibles. -
json_parse() ya no ignora los caracteres finales: anteriormente, las entradas como
[1,2]abc
se analizaban con éxito como[1,2]
. El uso de caracteres finales ahora genera el mensaje de errorCannot convert '[1, 2]abc' to JSON
(No se puede convertir '[1, 2]abc' a JSON). -
Precisión decimal round() corregida:
round(x, d)
ahora redondea correctamentex
cuandox
es un DECIMAL o cuandox
es un DECIMAL con escala 0 yd
es un número entero negativo. Anteriormente, no había redondeado en estos casos. -
round(x, d) y truncate(x, d): el parámetro
d
en la firma de funcionesround(x, d)
ytruncate(x, d)
ahora es de tipoINTEGER
. Anteriormente,d
podía ser de tipoBIGINT
. -
Map() con claves duplicadas:
map()
ahora genera un error en claves duplicadas en lugar de producir silenciosamente un mapa dañado. Las consultas que actualmente construyen valores de mapa utilizando claves duplicadas ahora fallan con un error. -
map_from_entries() genera un error con entradas nulas:
map_from_entries()
ahora genera un error cuando la matriz de entrada contiene una entrada nula. Ahora, las consultas que construyen un mapa conNULL
como un valor fallan. -
Tablas: ya no se pueden crear tablas que tienen tipos de partición no admitidos.
-
Mejora de la estabilidad numérica en funciones estadísticas: se ha mejorado la estabilidad numérica de las funciones estadísticas
corr()
,covar_samp()
,regr_intercept()
yregr_slope()
. -
La precisión TIMESTAMP definida en Parquet ahora se respeta: la precisión de
TIMESTAMP
y la precisión definida para la columnaTIMESTAMP
en el esquema Parquet ahora deben coincidir. Las precisiones que no coincidan generan marcas de tiempo incorrectas. -
Información de zona horaria: ahora, la información de zona horaria se calcula utilizando el paquete java.time
del SDK de Java 1.8. -
Suma de los tipos de datos INTERVAL_DAY_TO_SECOND e INTERVAL_YEAR_TO_MONTH: ya no puede utilizar
SUM(NULL)
directamente. Para usarSUM(NULL)
, debe convertirNULL
a un tipo de datos comoBIGINT
,DECIMAL
,REAL
,DOUBLE
,INTERVAL_DAY_TO_SECOND
oINTERVAL_YEAR_TO_MONTH
.
Cambios en las funciones geoespaciales
Los cambios realizados en las funciones geoespaciales incluyen los siguientes.
-
Cambios de nombre de función: algunos nombres de funciones han cambiado. Para obtener más información, consulte Cambios de nombre de la función geoespacial en la versión 2 del motor Athena.
-
Entrada VARBINARY: el tipo
VARBINARY
ya no se admite directamente para la entrada de funciones geoespaciales. Por ejemplo, para calcular el área de una geometría directamente, ahora la geometría se debe introducir en formatoVARCHAR
oGEOMETRY
. La solución alternativa consiste en utilizar funciones de transformación, como en los siguientes ejemplos.-
Para utilizar
ST_area()
para calcular el área de entradaVARBINARY
en formato binario conocido (WKB, Well-Known Binary), pase la entrada aST_GeomFromBinary()
primero, por ejemplo:ST_area(ST_GeomFromBinary(
<wkb_varbinary_value>
)) -
Para utilizar
ST_area()
para calcular el área de entradaVARBINARY
en formato binario heredado, pase la misma entrada a la funciónST_GeomFromLegacyBinary()
primero, por ejemplo:ST_area(ST_GeomFromLegacyBinary(
<legacy_varbinary_value>
))
-
-
ST_ExteriorRing() y ST_Polygon(): ST_ExteriorRing() y ST_Polygon() ahora aceptan solo polígonos como entradas. Anteriormente, estas funciones aceptaban de manera errónea otras geometrías.
-
ST_Distance(): según lo requerido por la Especificación SQL/MM
, la función ST_Distance() ahora devuelve NULL
si una de las entradas es una geometría vacía. Anteriormente, se devolvíaNaN
.
Conformidad con ANSI SQL
Se han corregido los siguientes problemas de sintaxis y comportamiento para seguir el estándar ANSI SQL.
-
Operaciones cast(): las operaciones de cast() de REAL o DOBLE a DECIMAL ahora se ajustan al estándar SQL. Por ejemplo,
cast (double '100000000000000000000000000000000' as decimal(38))
antes devolvía100000000000000005366162204393472
, pero ahora devuelve100000000000000000000000000000000
. -
JOIN... USING:
JOIN ... USING
ahora se ajusta a la semántica SQL estándar. Anteriormente,JOIN ... USING
requería calificar el nombre de la tabla en columnas, y la columna de ambas tablas estaba presente en la salida. Ahora, las calificaciones de tabla no son válidas y la columna solo está presente una vez en la salida. -
Literales de tipo fila eliminados: el formato literal de tipo fila
ROW<int, int>(1, 2)
ya no es compatible. En su lugar, utilice la sintaxisROW(1 int, 2 int)
. -
Semántica de agregación agrupada: las agregaciones agrupadas utilizan semántica
IS NOT DISTINCT FROM
en lugar de semántica de igualdad. Las agregaciones agrupadas ahora devuelven resultados correctos y muestran un rendimiento mejorado al agrupar en valores de punto flotanteNaN
. Se admite la agrupación en tipos de mapa, lista y fila que contienen valores nulos. -
Los tipos con comillas ya no están permitidos: de acuerdo con el estándar ANSI SQL, ya no se pueden incluir entre comillas los tipos de datos. Por ejemplo,
SELECT "date" '2020-02-02'
ya no es una consulta válida. En su lugar, se debe utilizar la sintaxisSELECT date '2020-02-02'
. -
Acceso al campo de fila anónimo: ya no se puede acceder a los campos de fila anónimos utilizando la sintaxis [
.field0, .field1, ...
]. -
Operaciones de agrupación complejas: las operaciones de agrupación complejas
GROUPING SETS
,CUBE
yROLLUP
no admiten agrupación en expresiones compuestas de columnas de entrada. Solo se admiten nombres de columnas.
Funciones reemplazadas
Las siguientes funciones ya no son compatibles y se han reemplazado por sintaxis que generan los mismos resultados.
-
information_schema.__internal_partitions__: el uso de
__internal_partitions__
ya no es compatible con la versión 2 del motor de Athena. Para una sintaxis equivalente, utiliceSELECT * FROM "
o<table_name>
$partitions"SHOW PARTITIONS
. Para obtener más información, consulte Enumeración de las particiones de una tabla específica. -
Funciones geoespaciales reemplazadas: para obtener una lista de funciones geoespaciales cuyos nombres han cambiado, consulte Cambios de nombre de la función geoespacial en la versión 2 del motor Athena.
Límites
En la versión 2 del motor Athena se introdujeron los siguientes límites para garantizar que las consultas no fallen debido a limitaciones de recursos. Los usuarios no pueden configurar estos límites.
-
Número de elementos de resultado: el número de elementos de resultado
n
está restringido a 10 000 o menos para las siguientes funciones:min(col, n)
,max(col, n)
,min_by(col1, col2, n)
ymax_by(col1, col2, n)
. -
Conjuntos de agrupación: el número máximo de sectores en un conjunto de agrupación es 2048.
-
Longitud máxima de línea del archivo de texto: la longitud máxima de línea predeterminada para los archivos de texto es de 200 MB.
-
Tamaño máximo del resultado de la función de secuencia: el tamaño máximo de resultado de una función de secuencia es 50 000 entradas. Por ejemplo,
SELECT sequence(0,45000,1)
se realiza correctamente, peroSELECT sequence(0,55000,1)
falla con el mensaje de errorEl resultado de la función de secuencia no debe tener más de 50 000 entradas
. Este límite se aplica a todos los tipos de entrada de funciones de secuencia, incluidas las marcas de tiempo.