¿Por qué se produce el error «HIVE_INVALID_METADATA: Los metadatos de Hive para la tabla no son válidos: El descriptor de la tabla contiene columnas duplicadas» en mi consulta de Amazon Athena?

4 minutos de lectura
0

Se produce el error «HIVE_INVALID_METADATA: Los metadatos de Hive para la tabla sample_table no son válidos: El descriptor de la tabla contiene columnas duplicadas» en mi consulta de Amazon Athena.

Descripción breve

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, ejecute SHOW CREATE TABLE para recuperar el esquema de la tabla. O bien, consulte 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, ejecute CREATE TABLE para volver a crear la tabla de Athena con nombres de columna únicos. O bien, utilice la consola de AWS Glue para cambiar el nombre de las columnas duplicadas:

  1. Abra la consola de AWS Glue.
  2. Elija el nombre de la tabla en la lista y, a continuación, elija Editar esquema.
  3. Elija el nombre de la columna, introduzca un nombre nuevo y, a continuación, seleccione Guardar.

Compruebe 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, consulte 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 muestra:

{ "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)

Utilice una de las siguientes opciones para resolver el problema:

  • Cambie el nombre de la columna de partición en la ruta de Amazon Simple Storage Service (Amazon S3).
  • Cambie 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, vuelva a crear manualmente la tabla y añada particiones en Athena mediante la función de asignación, en lugar de utilizar un rastreador de AWS Glue. 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, utilice 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')

Compruebe si hay claves duplicadas en los datos de origen JSON

Si los datos de origen JSON contienen nombres de columna que solo se diferencia por las mayúsculas y minúsculas (por ejemplo, {«Usuario»: «bob1234», «usuario»: «bob» }), consulte ¿Por qué aparecen errores cuando intento leer datos JSON en Amazon Athena? Athena no distingue entre mayúsculas y minúsculas de forma predeterminada. Athena trata «Usuario» y «usuario» como claves duplicadas, a menos que utilice OpenX SerDe y establezca la propiedad case.insensitive en false.


Información relacionada

Bibliotecas JSON SerDe

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años