web-dev-qa-db-fra.com

Comment créer une table AWS Glue où les partitions ont différentes colonnes? ('Hive_PARTITION_SCHEMA_MISMATCH')

Conformément à ceci AWS Forum Thread , quelqu'un sait-il comment utiliser AWS Glue pour créer une table AWS Athena dont les partitions contiennent différents schémas (dans ce cas, différents sous-ensembles de colonnes du schéma de table)?

Pour le moment, lorsque j'exécute le robot sur ces données, puis que j'effectue une requête dans Athena, j'obtiens l'erreur 'Hive_PARTITION_SCHEMA_MISMATCH'

Mon cas d'utilisation est:

  • Les partitions représentent des jours
  • Les fichiers représentent des événements
  • Chaque événement est un blob json dans un seul fichier s3
  • Un événement contient un sous-ensemble de colonnes (selon le type d'événement)
  • Le "schéma" de la table entière est l'ensemble complet de colonnes pour tous les types d'événements (correctement assemblé par le robot Glue)
  • Le "schéma" de chaque partition est le sous-ensemble de colonnes pour les types d'événements qui se sont produits ce jour-là (par conséquent, dans Glue, chaque partition a potentiellement un sous-ensemble de colonnes différent du schéma de table)
  • Cette incohérence provoque l'erreur dans Athena je pense

Si je devais écrire manuellement un schéma, je pourrais faire très bien car il n'y aurait qu'un seul schéma de table, et les clés manquantes dans le fichier JSON seraient traitées comme des null.

Merci d'avance!

26
rjmurt

J'ai eu le même problème, je l'ai résolu en configurant le robot pour mettre à jour les métadonnées de table pour les partitions préexistantes:

enter image description here

35
Mario Filipović

Cela m'a aidé. Publier l'image pour les autres en cas de perte du lien enter image description here

4
Radford7821

Cela a également résolu mon problème! Si quelqu'un a besoin de provisionner ce robot de configuration avec Terraform, voici comment je l'ai fait:

resource "aws_glue_crawler" "crawler-s3-rawdata" {
  database_name = "my_glue_database"
  name          = "my_crawler"
  role          = "my_iam_role.arn"

  configuration = <<EOF
{
   "Version": 1.0,
   "CrawlerOutput": {
      "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }
   }
}
EOF
  s3_target {
    path = "s3://mybucket"
  }
}
0
ADV-IT