Trabajo con datos de marca de tiempo
En esta sección se describen algunas consideraciones para trabajar con datos de marcas de tiempo en Athena.
nota
El tratamiento de las marcas de tiempo ha cambiado un poco entre la versión 2 y 3 del motor de Athena. Para obtener información sobre los errores relacionados con la marca de tiempo que se pueden producir en la versión 3 del motor de Athena y las soluciones sugeridas, consulte Cambios en la marca de tiempo en la referencia de Versión 3 del motor Athena.
Formato para escribir datos de marcas de tiempo en objetos de Amazon S3
El formato en el que se deben escribir los datos de marcas de tiempo en los objetos de Amazon S3 depende tanto del tipo de datos de la columna como de la biblioteca SerDe que utilice.
-
Si cuenta con una columna de tabla de tipo
DATE
, Athena espera que la columna o propiedad correspondiente de los datos sea una cadena en el formato ISOYYYY-MM-DD
o un tipo de fecha integrado, como los de Parquet u ORC. -
Si cuenta con una columna de tabla de tipo
TIME
, Athena espera que la columna o propiedad correspondiente de los datos sea una cadena en el formato ISOHH:MM:SS
o un tipo de hora integrado, como los de Parquet u ORC. -
Si cuenta con una columna de tabla de tipo
TIMESTAMP
, Athena espera que la columna o propiedad correspondiente de los datos sea una cadena en el formatoYYYY-MM-DD HH:MM:SS.SSS
(tenga en cuenta el espacio entre la fecha y la hora) o un tipo de hora integrado, como los de Parquet, ORC o Ion. Tenga en cuenta que Athena no garantiza el comportamiento de las marcas de tiempo que son inválidas (por ejemplo,0000-00-00 08:00:00.000
).nota
Las marcas de tiempo de OpenCSVSerDe son una excepción y se deben codificar como periodos UNIX con una resolución de milisegundos.
Cómo garantizar que los datos particionados en el tiempo coincidan con el campo de marca de tiempo de un registro
El productor de los datos debe asegurarse de que los valores de la partición se alineen con los datos de la partición. Por ejemplo, si sus datos tienen una propiedad timestamp
y utiliza Firehose para cargar los datos en Amazon S3, debe utilizar la partición dinámica, ya que la partición predeterminada de Firehose se basa en un tiempo cronológico.
Uso de una cadena como tipo de datos para las claves de partición
Por motivos de rendimiento, es preferible utilizar STRING
como el tipo de datos para las claves de partición. Si bien Athena reconoce los valores de partición en el formato YYYY-MM-DD
como fechas al utilizar el tipo DATE
, esto puede provocar un rendimiento deficiente. Por este motivo, en su lugar le recomendamos que utilice el tipo de datos STRING
para las claves de partición.
Cómo escribir consultas para campos de marca de tiempo que también se encuentren particionados por tiempo
La forma en que se escriben las consultas para los campos de marca de tiempo que se encuentran particionados por tiempo dependen del tipo de tabla que se desee consultar.
Tablas de Hive
Con las tablas de Hive más utilizadas en Athena, el motor de consultas no conoce las relaciones entre las columnas y las claves de partición. Por este motivo, siempre debe agregar predicados en las consultas tanto para la columna como para la clave de partición.
Por ejemplo, supongamos que tiene una columna event_time
y una clave de partición event_date
y desea consultar eventos entre las 23:00 y las 03:00. En este caso, debe incluir predicados en la consulta tanto para la columna como para la clave de partición, como en el siguiente ejemplo.
WHERE event_time BETWEEN
start_time
ANDend_time
AND event_date BETWEENstart_time_date
ANDend_time_date
Tablas de Iceberg
Con las tablas de Iceberg, puede utilizar valores de partición calculados, lo que simplifica las consultas. Por ejemplo, supongamos que la tabla de Iceberg se creó con una cláusula PARTITIONED BY
como la siguiente:
PARTITIONED BY (event_date month(event_time))
En este caso, el motor de consultas reduce de forma automática las particiones en función de los valores de los predicados event_time
. Por este motivo, la consulta solo necesita especificar un predicado para event_time
, como en el siguiente ejemplo.
WHERE event_time BETWEEN
start_time
ANDend_time
Para obtener más información, consulte Creación de tablas de Iceberg.