Как создать таблицу AWS Glue, где разделы имеют разные столбцы? ( 'HIVE_PARTITION_SCHEMA_MISMATCH')

В соответствии с этим Тема форума AWS, кто-нибудь знает, как использовать AWS-клей для создания таблицы AWS Athena, чьи разделы содержат разные схемы (в в этом случае разные подмножества столбцов из схемы таблицы)?

В настоящий момент, когда я запускаю искатель над этими данными, а затем делаю запрос в Athena, я получаю сообщение об ошибке 'HIVE_PARTITION_SCHEMA_MISMATCH'

Мой вариант использования:

  • Разделы представляют дни
  • Файлы представляют события
  • Каждое событие представляет собой json blob в одном файле s3
  • Событие содержит подмножество столбцов (в зависимости от типа события)
  • "Схема" всей таблицы - это полный набор столбцов для всех типов событий (это правильно составлено с помощью искателя Glue)
  • "Схема" каждого раздела - это поднабор столбцов для типов событий, которые произошли в этот день (следовательно, в Клее каждый раздел потенциально имеет другой поднабор столбцов из схемы таблицы).
  • Эта несогласованность вызывает ошибку в Афине, я думаю.

Если бы я должен был вручную написать схему, я мог бы сделать это хорошо, поскольку просто была бы одна схема таблицы, а ключи, отсутствующие в файле JSON, будут обрабатываться как Nulls.

Спасибо заранее!

Ответ 1

У меня была та же проблема, я решил ее, настроив сканер для обновления метаданных таблицы для уже существующих разделов:

enter image description here

Ответ 2

Это помогло мне. Размещение изображения для других в случае потери ссылки enter image description here

Ответ 3

Это также исправило мою проблему! Если кому-то нужно подготовить этот сканер конфигурации с помощью Terraform, вот как я это сделал:

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"
  }
}