每次新文件替换新文件时,AWS Glue 都会创建一个新的临时表

问题描述 投票:0回答:1

我们每天都会从第三方系统的 s3 存储桶中收到新文件。从这个 s3 存储桶中,我们将数据复制到另一个 s3 存储桶中。文件名为 results.parquet。我们每天运行一个 Glue 爬虫,它在目标存储桶中的目标文件夹路径上运行,以创建一个新表 ltv_results。

我们返回了一个 python 脚本,用于将此文件从一个 s3 复制到另一个 s3。这个 python 脚本做了两件事:

  1. 删除昨天目标 s3 存储桶中的文件 results.parquet。
  2. 将今天收到的新文件 results.parquet 从源复制到目标 s3 位置。

目标文件夹结构如下:

s3://destination_bucket_name/ecomm_prod/act/ltv_results/app_id=APP-0103/
。在此文件夹中,我们复制文件 results.parquet。

由于此路径与 hive 标准兼容,因此 ltv_results 根据 app_id 列进行分区。

每天都会有一个同名的新文件替换旧文件。

python 脚本从路径

's3://destination_bucket_name/ecomm_prod'
中删除 s3 中的内容,因此每天都会使用 app_id 创建 ltv_results 文件夹。

问题是,当我们在同一个文件上多次运行 Glue 爬虫时,它不会检测到更改并且不会执行任何操作,这是正确的。但是,当第二天有新文件到来时,它不会删除表并使用新文件内容刷新表,而是创建一个新表 ltv_results_88434343 并将数据存储到该表中。

我读到 Glue 仅读取增量数据。我希望 Glue 应该只每天刷新表中的数据,而不是每天在目标文件夹中复制新文件时创建新表。

请指教。

amazon-web-services aws-glue amazon-athena
1个回答
0
投票

正如评论中所解释的,爬虫只需要发现数据的模式,如果模式没有改变,则不需要重新运行爬虫。

更重要的是,要了解 Athena 不是加载数据的标准数据库。 Glue 表只是查询引擎如何查找和解析 S3 中的数据的映射。

如果您仅在确切位置(如 Glue 表中定义)替换具有相同架构的一个 parquet 文件,查询引擎将查询该新文件而不更改任何内容。

如果您想添加新数据(例如每天),您可以简单地将其放在确切的文件夹位置,或者在根位置下创建一个新文件夹,并使用

MSCK REPAIR TABLE <TABLE_NAME>

更新 Glue 的分区映射

另一种选择是删除旧表(请记住,这只是数据的映射,而不是数据本身)并使用爬虫重新创建表。如果数据架构经常更改,这是一个不错的选择。

© www.soinside.com 2019 - 2024. All rights reserved.