Al usar AWS re:Post, aceptas las AWS re:Post Términos de uso

¿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 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, 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 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)

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, utilice la función de asignación en lugar del rastreador de AWS Glue para recrear la tabla manualmente. A continuación, añada 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, 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')

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, {«Usuario»: «bob1234», «usuario»: «bob» }), consulte ¿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 «Usuario» y «usuario» como claves duplicadas, a menos que utilice OpenX SerDe y establezca la propiedad case.insensitive en false.

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, cambie uno de los nombres de las columnas. Establezca la propiedad de SerDe parquet-column.index.access a true. Parquet accede a las columnas por nombre y a ORC por índice.

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

Información relacionada

Bibliotecas JSON SerDe

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 10 meses