web-dev-qa-db-ja.com

パーティションに異なる列があるAWS Glueテーブルを作成する方法は? ( 'Hive_PARTITION_SCHEMA_MISMATCH')

このように AWSフォーラムスレッド 、AWS Glueを使用して、パーティションに異なるスキーマ(この場合はテーブルスキーマの異なる列のサブセット)が含まれるAWS Athenaテーブルを作成する方法を知っていますか?

現時点では、このデータに対してクローラーを実行し、Athenaでクエリを実行すると、エラー'Hive_PARTITION_SCHEMA_MISMATCH'

私のユースケースは:

  • パーティションは日を表します
  • ファイルはイベントを表します
  • 各イベントは、単一のs3ファイル内のJSON BLOBです
  • イベントには列のサブセットが含まれます(イベントのタイプに依存)
  • テーブル全体の「スキーマ」は、すべてのイベントタイプの列の完全なセットです(これは、Glueクローラーによって正しくまとめられます)
  • 各パーティションの「スキーマ」は、その日に発生したイベントタイプの列のサブセットです(したがって、Glueの各パーティションには、テーブルスキーマからの列の異なるサブセットがある可能性があります)
  • この矛盾により、アテナでエラーが発生すると思います

スキーマを手動で記述する場合、テーブルスキーマは1つしかなく、JSONファイルにないキーはNullとして扱われるため、これをうまく行うことができます。

前もって感謝します!

26
rjmurt

同じ問題があり、既存のパーティションのテーブルメタデータを更新するようにクローラーを構成することで解決しました。

enter image description here

35

これは私を助けました。リンクが失われた場合に他の人に画像を投稿する enter image description here

4
Radford7821

それは私の問題も修正しました!誰かがこの構成クローラーを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"
  }
}
0
ADV-IT