Gestión de las actualizaciones de los esquemas - Amazon Athena

Gestión de las actualizaciones de los esquemas

En esta sección, se proporciona orientación sobre cómo gestionar las actualizaciones de los esquemas con formatos de datos distintos. Athena es un motor de consultas de esquema sobre lectura. Esto significa que, al crear una tabla en Athena, aplica los esquemas al leer los datos. No cambia ni reescribe los datos subyacentes.

Si prevé cambios en los esquemas de las tablas, considere la posibilidad de crearlas en un formato de datos adecuado a sus necesidades. Su objetivo consiste en reutilizar las consultas de Athena existentes a medida que evolucionan los esquemas y evitar errores de discrepancia de esquemas al consultar tablas con particiones.

Para alcanzar este objetivo, elija un formato para los datos de una tabla basándose en la tabla del siguiente tema.

Operaciones de actualización de esquemas compatibles por formato de datos

En la siguiente tabla, se resumen los formatos de almacenamiento de datos y las manipulaciones de esquemas compatibles. Utilice esta tabla como ayuda para elegir el formato que le permitirá continuar utilizando las consultas de Athena incluso si los esquemas cambian a lo largo del tiempo.

En esta tabla, observe que Parquet y ORC son formatos de columna con diferentes métodos de acceso predeterminados a las columnas. De forma predeterminada, Parquet obtendrá acceso a las columnas por nombre y ORC por índice (valor ordinal). Por lo tanto, Athena proporciona una propiedad del SerDe definida al crear una tabla para cambiar el método de acceso predeterminado a las columnas, lo que permite una mayor flexibilidad en la evolución del esquema.

En Parquet, la propiedad parquet.column.index.access puede configurarse como true, lo que indica al método de acceso a las columnas que debe utilizar el número ordinal de la columna. Si establece esta propiedad en false, el método de acceso a las columnas utilizará el nombre de la columna. Del mismo modo, en ORC, utilice la propiedad orc.column.index.access para controlar el método de acceso a las columnas. Para obtener más información, consulte Descripción del acceso a los índices para Apache ORC y Apache Parquet.

CSV y TSV le permiten realizar todas las manipulaciones de esquemas, excepto la reordenación de columnas y la adición de columnas al principio de la tabla. Por ejemplo, si la evolución del esquema requiere únicamente cambiar el nombre de las columnas pero no eliminarlas, puede optar por crear las tablas en CSV o TSV. Si necesita eliminar columnas, no utilice CSV ni TSV, sino cualquiera de los demás formatos compatibles, preferiblemente un formato de columna, como Parquet u ORC.

Actualizaciones de esquemas y formatos de datos en Athena
Tipo esperado de actualización de esquema Resumen CSV (con y sin encabezados) y TSV JSON AVRO PARQUET: lectura por nombre (predeterminado) PARQUET: lectura por índice ORC: lectura por índice (predeterminado) ORC: lectura por nombre
Cambio del nombre de las columnas Almacene los datos en CSV y TSV, o en ORC y Parquet si se leen por índice. Y N N N Y Y N
Adición de columnas al principio o en medio de la tabla Almacene los datos en JSON o AVRO, o en Parquet y ORC si se leen por nombre. No utilice CSV ni TSV. N Y Y Y N N Y
Adición de columnas al final de la tabla Almacene los datos en CSV o TSV, JSON, AVRO, ORC o Parquet. Y Y Y Y Y Y Y
Eliminación de columnas Almacene los datos en JSON o AVRO, o en Parquet y ORC si se leen por nombre. No utilice CSV ni TSV. N Y Y Y N N Y
Reordenación de columnas Almacene los datos en AVRO, JSON u ORC y en Parquet si se leen por nombre. N Y Y Y N N Y
Cambio del tipo de datos de una columna Almacene los datos en cualquier formato, pero pruebe la consulta en Athena para asegurarse de que los tipos de datos son compatibles. Para Parquet y ORC, el cambio de tipo de datos funciona solo para las tablas con particiones. Y Y Y Y Y Y Y

Descripción del acceso a los índices para Apache ORC y Apache Parquet

PARQUET y ORC son formatos de almacenamiento de datos en columnas que se pueden leer por índice o por nombre. Si almacena los datos en cualquiera de estos formatos, podrá realizar todas las operaciones en los esquemas y ejecutar consultas de Athena sin errores de discrepancia de esquemas.

  • Athena lee ORC por índice de forma predeterminada, tal como se define en SERDEPROPERTIES ( 'orc.column.index.access'='true'). Para obtener más información, consulte ORC: lectura por índice.

  • Athena lee Parquet por nombre de forma predeterminada, tal y como se define en SERDEPROPERTIES ( 'parquet.column.index.access'='false'). Para obtener más información, consulte Parquet: lectura por nombre.

Dado que estos son valores predeterminados, es opcional especificar estas propiedades del SerDe en las consultas CREATE TABLE, ya que se utilizan implícitamente. Cuando se utilizan, le permiten ejecutar algunas operaciones de actualización de esquemas al mismo tiempo que impiden llevar a cabo otras operaciones similares. Para habilitar esas operaciones, ejecute otra consulta CREATE TABLE y cambie la configuración del SerDe.

nota

Las propiedades de SerDe no se propagan automáticamente en cada partición. Utilice declaraciones de ALTER TABLE ADD PARTITION para configurar las propiedades de SerDe para cada partición. Para automatizar este proceso, escriba un script que ejecute declaraciones de ALTER TABLE ADD PARTITION.

En las siguientes secciones se describen estos casos de manera detallada.

ORC: lectura por índice

Una tabla con formato ORC se lee por índice, de forma predeterminada. Esto lo define la siguiente sintaxis:

WITH SERDEPROPERTIES ( 'orc.column.index.access'='true')

La lectura por índice le permite cambiar el nombre de las columnas. Sin embargo, perderá la capacidad de eliminar columnas o añadirlas en medio de la tabla.

Para que ORC lea por nombre, lo que le permitirá añadir columnas en medio de la tabla o eliminar columnas en ORC, establezca la propiedad del SerDe orc.column.index.access en false en la instrucción CREATE TABLE. En esta configuración, perderá la capacidad de cambiar el nombre de las columnas.

nota

En la versión 2 del motor de Athena, cuando las tablas ORC están configuradas para leer por nombre, Athena exige que todos los nombres de columna de los archivos ORC estén en minúsculas. Como Apache Spark no tiene nombres de campo en minúsculas cuando genera archivos ORC, es posible que Athena no pueda leer los datos así generados. La solución consiste en cambiar el nombre de las columnas para que estén en minúsculas o usar la versión 3 del motor de Athena.

El siguiente ejemplo ilustra cómo cambiar el formato ORC para que lea por nombre:

CREATE EXTERNAL TABLE orders_orc_read_by_name ( `o_comment` string, `o_orderkey` int, `o_custkey` int, `o_orderpriority` string, `o_orderstatus` string, `o_clerk` string, `o_shippriority` int, `o_orderdate` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' WITH SERDEPROPERTIES ( 'orc.column.index.access'='false') STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/orders_orc/';

Parquet: lectura por nombre

Una tabla con formato Parquet se lee por nombre, de forma predeterminada. Esto lo define la siguiente sintaxis:

WITH SERDEPROPERTIES ( 'parquet.column.index.access'='false')

La lectura por nombre le permite añadir columnas en medio de la tabla y eliminar columnas. Sin embargo, perderá la capacidad de cambiar el nombre de las columnas.

Para que Parquet lea por índice, lo que le permitirá cambiar el nombre de las columnas, debe crear una tabla con la propiedad del SerDe parquet.column.index.access establecida en true.