Saltar al contenido

¿Por qué se produce el error "HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns" en mi consulta de Athena?

4 minutos de lectura
0

Mi consulta de Amazon Athena falla y se produce el error "HIVE_INVALID_METADATA: Hive metadata for table sample_table is invalid: Table descriptor contains duplicate columns".

Descripción corta

Este error se produce cuando el esquema de tablas de AWS Glue contiene nombres de columna duplicados o columnas con el mismo nombre que las columnas de partición.

Resolución

Comprobar si hay nombres de columna duplicados

Para identificar la columna duplicada, ejecuta SHOW CREATE TABLE para recuperar el esquema de la tabla. O bien, consulta el esquema de la tabla en la consola de AWS Glue. En el siguiente ejemplo, hay dos columnas denominadas "column1."

CREATE EXTERNAL TABLE `athenatestingduplicatecolumn_athenatesting`(  `column1` bigint,
  `column2` bigint,
  `column3` bigint,
  `column1` bigint)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://doc-example-bucket/athenatesting/'
TBLPROPERTIES (
  'classification'='csv',
  'skip.header.line.count'='1'
  )

Para resolver el error, ejecuta CREATE TABLE para volver a crear la tabla de Athena con nombres de columna únicos. O bien, utiliza la consola de AWS Glue para cambiar el nombre de las columnas duplicadas:

  1. Abre la consola de AWS Glue.
  2. Elige el nombre de la tabla en la lista y, a continuación, elige Editar esquema.
  3. Elige el nombre de la columna, introduce un nombre nuevo y, a continuación, selecciona Guardar.

Comprobar si hay columnas de tabla y de partición que tengan el mismo nombre

Para comprobar si hay nombres de columnas de partición y de tabla duplicados, consulta el esquema de la tabla en la consola de AWS Glue. En el ejemplo siguiente, la columna de partición y de tabla se denominan "id".

Datos de ejemplo:

{ "id" : 50, "name":"John" }{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }

Definición de tabla:

Nombre de columnaTipo de datosClave de partición
idint
nombrecadena
idcadenaPartición (0)

Utiliza una de las siguientes opciones para resolver el problema:

  • Cambia el nombre de la columna de partición en la ruta de Amazon Simple Storage Service (Amazon S3).
  • Cambia el nombre de la columna en los datos y en la definición de la tabla de AWS Glue.
  • Si los datos de origen son JSON, utiliza la función de asignación en lugar del rastreador de AWS Glue para recrear la tabla manualmente. A continuación, agrega particiones en Athena. En el siguiente ejemplo, la tabla de AWS Glue apunta a s3://doc-example-bucket/athenajsontesting/, que tiene esta estructura de particiones: s3://doc-example-bucket/athenajsontesting/id=12. Después de crear la tabla, utiliza MSCK REPAIR TABLE para cargar la partición.
CREATE EXTERNAL TABLE `athenajsontest_athenajsontesting2`(  `id1` int COMMENT 'from deserializer',
  `name` string COMMENT 'from deserializer')
PARTITIONED BY (
  `id` string)
ROW FORMAT SERDE
  'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'mapping.id1'='id')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://doc-example-bucket/athenajsontesting'
TBLPROPERTIES (
  'classification'='json',
  'transient_lastDdlTime'='1578399113')

Cómo comprobar si hay claves duplicadas en los datos de origen JSON

Si los datos de origen JSON contienen nombres de columna que solo se diferencian por las mayúsculas y minúsculas (por ejemplo, {"Username": "bob1234", "username": "bob" }, consulta ¿Por qué aparecen errores cuando intento leer datos JSON en Amazon Athena? De forma predeterminada, Athena no distingue entre mayúsculas y minúsculas. Athena trata "Username" y ** como claves duplicadas, a menos que utilices OpenX SerDe y establezcas la propiedad case.insensitive en **false"username".

Cómo comprobar si hay claves duplicadas en los datos de origen de Parquet

Si el origen de datos está en formato Parquet y la tabla tiene una columna duplicada, cambia uno de los nombres de las columnas. Establece la propiedad de SerDe parquet-column.index.access en true. Parquet accede a las columnas por nombre y a ORC por índice.

Para obtener más información, consulta Gestión de las actualizaciones de los esquemas.

Información relacionada

Bibliotecas de SerDe JSON

OFICIAL DE AWSActualizada hace 2 años