我应该每次都运行 Glue 爬虫来获取最新数据吗?

Posted

技术标签:

【中文标题】我应该每次都运行 Glue 爬虫来获取最新数据吗?【英文标题】:Should I run Glue crawler everytime to fetch latest data? 【发布时间】:2020-10-13 21:53:57 【问题描述】:

我有一个名为 Employee 的 S3 存储桶。每三个小时我都会在存储桶中获取一个带有时间戳的文件。我将使用 Glue 作业将文件从 S3 移动到 Redshift,并进行一些转换。我在 S3 存储桶中的输入文件将具有固定的结构。 My Glue Job 将使用通过爬虫在 Data Catalog 中创建的表作为输入。

第一次运行:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "test", table_name = "employee_623215", transformation_ctx = "datasource0")

三个小时后,如果我再为员工获取一份文件,我应该再次抓取它吗?

有没有办法在数据目录中拥有一个像员工这样的表,并使用最新的 S3 文件更新该表,Glue Job 可以使用该文件进行处理。还是应该每次都运行爬虫来获取最新数据?问题是我的数据目录中将创建更多的表。

如果可以,请告诉我。

【问题讨论】:

【参考方案1】:

如果架构发生更改,您只需再次运行 AWS Glue Crawler。只要架构保持不变,您就可以将文件添加到 Amazon S3,而无需重新运行 Crawler。

更新:@Eman 下面的评论是正确的

如果您正在阅读目录,则此建议将不起作用。如果不重新爬网,分区将不会更新到目录表。运行爬虫会将这些新分区映射到表中,并允许您处理第二天的分区。

【讨论】:

嗨丹尼斯,第一天我的胶水作业代码将有以下输入: 首次运行:datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "test", table_name = "employee", transformation_ctx = “datasource0”)(第一天数据)第二天,如果我在胶水作业代码中使用它,我将在 S3 存储桶中获得一个新数据 datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "test", table_name = "employee", transformation_ctx = "datasource0") 不会有前一天的数据吗?请让我现在! 如果您从目录中阅读此建议将不起作用。如果不重新爬网,分区将不会更新到目录表。运行爬虫会将这些新分区映射到表中,并允许您处理第二天的分区。【参考方案2】:

另一种方法可以是,而不是直接从 s3 读取目录并在 Glue 作业中处理数据。

这样你就不需要再次运行爬虫了。

使用

from_options(connection_type, connection_options=, format=None, format_options=, transformation_ctx="")

记录在案的here

【讨论】:

嗨,Shubham,我的传入文件将有一个时间戳。如果我必须直接从 S3 使用它,我需要每次在 Glue 作业中更改文件名,这对于生产环境来说并不理想。如果是这种情况,请告诉我。 您只需要提供文件夹的路径而不是准确的文件名 我们应该如何处理多个文件?

以上是关于我应该每次都运行 Glue 爬虫来获取最新数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue - boto3 爬虫未创建表

通过 AWS 上的 API 在胶表上添加分区?

使用 AWS Glue 爬虫进行智能采样

每次我从 Python 库路径调用 .egg 时,AWS Glue 作业都会崩溃

在 Amazon Redshift 日志上运行 AWS Glue 爬虫会创建大量表

AWS Glue ETL 作业中的 Boto3 Glue