如何更改 Glue Crawler 创建的自动检测分区的列名?

Posted

技术标签:

【中文标题】如何更改 Glue Crawler 创建的自动检测分区的列名?【英文标题】:How to change column names of autodetected partitions created by Glue Crawler? 【发布时间】:2018-09-16 21:23:36 【问题描述】:

我有一个存储桶,用作 Kinesis Firehose 流的目的地。

Firehose 使用yyyy/mm/dd/HH 格式自动在该存储桶上创建基于日期的前缀。

然后我创建了一个爬虫,它将在这个存储桶中搜索数据并配置如下:

运行爬虫后,它会创建一个具有以下架构的表:

| #   | Column name   | Data type | Key           |
| --- | -----------   | --------- | ------------- |
| 1   | numberissues  | int       |               |
| 2   | group         | string    |               |
| 3   | createdat     | string    |               |
| 4   | companyunitid | string    |               |
| 5   | partition_0   | string    | Partition (0) |
| 6   | partition_1   | string    | Partition (1) |
| 7   | partition_2   | string    | Partition (2) |
| 8   | partition_3   | string    | Partition (3) |

如果我将 partition-* 重命名为正确的对应名称 yearmonthdayhour,则该表已可供我使用。

但是,如果爬虫再次运行,架构会将列名恢复为原始 partition-*

我知道这适用于 Hive 分区架构 year=2018/month=04...,但我想知道是否可以“提示”Glue 关于分区字段名称。

另一种选择是尝试更改 Firehose 前缀,但我找不到任何表明这是可能的。

【问题讨论】:

我了解您的情况。不幸的是,Glue 遵循 Hive 分区风格,但 kinesis firehose 不以这种格式写入。在这个时间点上,我认为我们不能做任何事情。 【参考方案1】:

在这种情况下,您可以设置“忽略更改并且不更新数据目录”选项。

然后您可以重命名列。这将允许爬虫在下次运行时检测新分区,但保留重命名的名称。

【讨论】:

现在看来很明显这会起作用,我很尴尬。非常感谢,@RicardoMayerhofer【参考方案2】:

现在可以为 Firehose 编写的 S3 前缀指定自定义格式。为了符合 Hive 分区风格,您可以在前缀中使用以下语法:

beginning_of_prefix/year=!timestamp:yyyy/month=!timestamp:MM/day=!timestamp:dd/hour=!timestamp:HH/

示例输出:

beginning_of_prefix/year=2021/month=09/day=03/hour=16/

这将使您的 Glue 爬虫能够识别分区的名称。

更详细地说,AWS 引入的 !namespace:value 语法允许访问 Firehose 用于分区的时间戳并将其打印到前缀中。这是通过将timestamp 指定为命名空间并将有效的Java DateTimeFormatter 字符串指定为值来完成的。请注意:

在评估时间戳时,Kinesis Data Firehose 使用正在写入的 Amazon S3 对象中包含的最早记录的大致到达时间戳。

还有:

如果您指定的前缀不包含时间戳命名空间表达式,Kinesis Data Firehose 会将表达式 !timestamp:yyyy/MM/dd/HH/ 附加到前缀字段中的值。

(所以如果不使用timestamp命名空间,则使用旧的分区方式)

例如,其他命名空间也支持按错误输出前缀的 firehose 错误类型进行分区。

Source

Docs

【讨论】:

以上是关于如何更改 Glue Crawler 创建的自动检测分区的列名?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS Glue Crawler 读取 PostgreSQL 表分区?

AWS Athena 从 S3 的 GLUE Crawler 输入 csv 创建的表中返回零记录

AWS Glue Crawler无法提取CSV标头

AWS Glue Crawler 为每个分区添加表?

Glue Crawler 跳过特定的 S3 文件夹

通过 AWS Glue Crawler 识别并存储在数据目录中的表的异常