Versión 2 del motor Athena - Amazon Athena

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. Utilice EXPLAIN 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 instrucciones SELECT. Para obtener más información, consulte SELECT.

  • Instrucción UNLOAD: puede utilizar la instrucción UNLOAD para escribir la salida de una consulta SELECT 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 derivadas LATERAL.

  • Conjuntos de agrupación: se ha agregado compatibilidad para cláusulas ORDER BY en agregaciones para consultas que utilizan GROUPING 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 y LEFT 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.

  • INT para INTEGER: se ha agregado compatibilidad para INT como alias para el tipo de datos INTEGER.

  • 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 tipo VARBINARY y IPADDRESS. El tipo IPADDRESS no se reconoce en las consultas DDL.

  • Es diferente de: se ha agregado compatibilidad IS DISTINCT FROM con tipos JSON y IPADDRESS.

  • Verificaciones de igualdad nulas: ya son compatibles las verificaciones de igualdad para valores nulos en estructuras de datos ARRAY, MAP y ROW. Por ejemplo, la expresión ARRAY ['1', '3', null] = ARRAY ['1', '2', null] devuelve false. Anteriormente, un elemento nulo devolvía el mensaje de error Comparació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 y TIMESTAMP.

  • 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 y RESPECT 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 y CHAR.

  • 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

reduce_agg()

Funciones y operadores de matriz

array_sort(): variante de esta función agregada que toma una función de Lambda como comparador.

ngrams()

Funciones binarias y operadores

from_big_endian_32()

from_ieee754_32()

from_ieee754_64()

hmac_md5()

hmac_sha1()

hmac_sha256()

hmac_sha512()

spooky_hash_v2_32()

spooky_hash_v2_64()

to_big_endian_32()

to_ieee754_32()

to_ieee754_64()

Funciones y operadores de fecha y hora

millisecond()

parse_duration()

to_milliseconds()

Funciones y operadores de mapa

multimap_from_entries()

Funciones y operadores matemáticos

inverse_normal_cdf()

wilson_interval_lower()

wilson_interval_upper()

Funciones de resumen de cuantiles

Funciones de resumen de cuantiles y el tipo de resumen de cuantil qdigest agregado.

Funciones y operadores de cadena

hamming_distance()

split_to_multimap()

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 o ROLLUP, 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 y AGGREGATE.

  • Like: se ha mejorado el rendimiento de las consultas que utilizan predicados LIKE en las columnas de tablas information_schema.

  • Ordenar por y límite: planes, rendimiento y uso de memoria mejorados para las consultas que implican ORDER BY y LIMIT 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áusulas ORDER 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 tipos ARRAY o MAP.

  • 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() y max() 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 y ORDER 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() y array_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 funciones ST_Envelope() y bing_tile_polygon()).

Funciones de mapa

  • Se ha mejorado el rendimiento del subíndice de mapa de O(n) a O(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() y map_entries().

Conversión

  • Se ha agregado la capacidad de convertir JSON desde REAL, TINYINT o SMALLINT.

  • Ahora puede convertir JSON a ROW incluso si el JSON no contiene todos los campos del ROW.

  • Se mejoró el rendimiento de CAST(json_parse(...) AS ...).

  • Se ha mejorado el rendimiento de la conversión de JSON a tipos ARRAY o MAP.

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 como DECIMAL en el esquema de Parquet. Las consultas en columnas fixed_len_byte_array sin la anotación DECIMAL fallan con un error. Anteriormente, las consultas en columnas fixed_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 error Cannot 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 correctamente x cuando x es un DECIMAL o cuando x es un DECIMAL con escala 0 y d 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 funciones round(x, d) y truncate(x, d) ahora es de tipo INTEGER. Anteriormente, d podía ser de tipo BIGINT.

  • 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 con NULL 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() y regr_slope().

  • La precisión TIMESTAMP definida en Parquet ahora se respeta: la precisión de TIMESTAMP y la precisión definida para la columna TIMESTAMP 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 usar SUM(NULL), debe convertir NULL a un tipo de datos como BIGINT, DECIMAL, REAL, DOUBLE, INTERVAL_DAY_TO_SECOND o INTERVAL_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 formato VARCHAR o GEOMETRY. 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 entrada VARBINARY en formato binario conocido (WKB, Well-Known Binary), pase la entrada a ST_GeomFromBinary() primero, por ejemplo:

      ST_area(ST_GeomFromBinary(<wkb_varbinary_value>))
    • Para utilizar ST_area() para calcular el área de entrada VARBINARY en formato binario heredado, pase la misma entrada a la función ST_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ía NaN.

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ía 100000000000000005366162204393472, pero ahora devuelve 100000000000000000000000000000000.

  • 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 sintaxis ROW(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 flotante NaN. 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 sintaxis SELECT 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 y ROLLUP 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.

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) y max_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, pero SELECT sequence(0,55000,1) falla con el mensaje de error El 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.