AWS Athena - 由于分区而导致的重复列

AWS Athena - duplicate columns due to partitionning

我们有一个 glue 爬虫,它读取 S3 中的 avro 文件并相应地在 glue 目录中创建一个 table。 问题是我们有一个名为 'foo' 的列,它来自 avro 模式,我们在 s3 存储桶路径中也有类似 'foo=XXXX' 的东西,以具有 Hive 分区。

我们不知道的是,爬虫随后会创建一个 table,它现在有两个同名的列,因此我们在查询 table:

时出现问题
HIVE_INVALID_METADATA: Hive metadata for table mytable is invalid: Table descriptor contains duplicate columns

有没有办法告诉 glue 将分区 'foo' 映射到另一个列名,例如 'bar'? 这样我们就可以避免通过在 s3 存储桶路径中指定一个新的分区名称来重新处理我们的数据..

或任何其他建议?

Glue Crawlers 非常糟糕,这只是它创建无法使用的 table 的众多方式之一。我认为您最好只使用简单的脚本创建 table 和分区。创建不带 foo 列的 table,然后编写一个脚本,在 S3 上列出您的文件,执行 Glue API 调用(BatchCreatePartition), or execute ALTER TABLE … ADD PARTITION … 在 Athena 中调用。

每当在 S3 上添加新数据时,只需使用 API 调用或 Athena 查询添加新分区。如果您知道添加数据的时间和方式,则无需完成 Glue Crawler 所做的所有工作。如果不这样做,您可以使用 S3 通知 运行 Lambda 函数来代替执行 Glue API 调用。几乎所有的解决方案都比 Glue Crawlers 好。

A​​thena 和 Glue Catalog 的美妙之处在于它只是元数据,将其全部丢弃并重新创建它的成本非常低。您还可以根据需要创建任意数量的 table 使用相同的位置,以尝试不同的模式。在你的情况下,不需要移动 S3 上的任何对象,你只需要一个不同的 table 和一个不同的机制来向它添加分区。

您可以通过更新粘附模式 table 并重命名重复的列来解决此问题:

  1. 打开 AWS Glue 控制台。
  2. 从列表中选择 table 名称,然后选择编辑架构。
  3. 选择列名foo(不是分区列foo),输入新名称,然后选择保存。

参考: Resolve HIVE_INVALID_METADATA error