如何在 ETL 处理之前检查 AWS Glue 架构?

Posted

技术标签:

【中文标题】如何在 ETL 处理之前检查 AWS Glue 架构?【英文标题】:How To Check AWS Glue Schema Before ETL Processing? 【发布时间】:2019-10-17 12:55:32 【问题描述】:

我想在使用 AWS Glue 进行 ETL 处理之前验证架构。我试图在 Glue 中做所有事情以避免使用 Airflow 或其他工具。

流程是 S3 原始数据 -> 在 Glue 中抓取 S3 数据 -> 执行架构检查 -> 使用 AWS Glue 的基本 ETL(目前是基本选择 *) -> 输出到 S3 -> 执行即席查询作为检查在使用 EC2 安装的 ETL 软件进一步处理之前。这个想法是,如果一个步骤失败了,我想发送一个通知(电子邮件或其他)失败的地方和位置。

样本数据文件:来自this link的第一个表(OrderDate, region,...)

选项 1:AWS Glue ETL 脚本执行脚本内字段的映射。如果存在无效的字段类型(例如 int 在日期列中),脚本会“失败”并停止吗?我没有在脚本中看到仅在处理之前验证架构的方法。

PySpark 中的示例脚本行:

applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [("orderdate", "string", "orderdate", "date"), ("region", "string", "region", "string"), ("rep", "string", "rep", "string"), ("item", "string", "item", "string"), ("units", "long", "units", "int"), ("unitcost", "double", "unitcost", "double"), ("total", "double", "total", "double")], transformation_ctx = "applymapping1")

选项 2:我正在阅读 Glue Classifiers。我已经建立了一个测试 CSV 分类器。我不确定如何将它应用到我实际抓取的数据中,因为没有选项可以将它们链接在一起。如果分类器失败了,ETL脚本还会运行吗?

样本分类器:Sample Classifier

工作流需要触发器,触发器需要 ETL 脚本,所以我不确定如何添加分类器。我假设在爬行发生时施加了分类器,但目前尚不清楚如何。

【问题讨论】:

【参考方案1】:

选项 1:

不,它不会失败。 Schema 将成为 struct 例如

struct : choice
|   |-- int
|   |-- date 

您可以使用dynamicframe.resolveChoice() 方法来解析数据类型。

检查:

    https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-samples-medicaid.html https://github.com/aws-samples/aws-glue-samples/blob/master/examples/resolve_choice.md

选项 2:

在爬虫本身,你可以设置分类器。在爬取数据时,爬虫将使用分类器。

如果分类器失败,爬虫可能会失败...与 ETL 脚本无关。

【讨论】:

选项 1:好的,但是如果架构错误,我想确保 ETL 被阻止。是否可以在脚本中阻止进一步处理?选项 2:好吧,刚刚看到了如何将分类器添加到爬虫本身。分类器强加于爬取,所以如果给定的schema有不正确的数据,爬取就会失败? 有没有办法改变被爬取数据的数据类型?例如,上面示例数据的第一列是作为字符串而不是日期出现的,因此不会显示错误数据。 选项 1:您可以编写 lambda/python shell 作业来检查并在从中检查模式后启动 ETL。如果您想在爬虫完成后立即启动 Lambda,它是正确的选择。您必须编写 cloudwatch 事件来触发 lambda。如果日期是 presto date 格式 (prestodb.github.io/docs/current/language/…) ,那么它将显示日期数据类型,否则显示字符串。爬虫没有设置日期格式的选项。 对于选项 2 - 我添加了一些错误数据 - 当爬虫现在运行时,它只是更改数据类型,而不是实际显示数据是错误的。这意味着我需要改用 Lambda 和 Option 1? Crawler 不是数据清理工具 :-) 所以它不会说数据不好。它只会尝试通过爬取数据来查找模式

以上是关于如何在 ETL 处理之前检查 AWS Glue 架构?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue ETL 作业中的 Boto3 Glue

AWS Glue 检查文件内容的正确性

如何在数据加载之前截断 AWS Glue 作业中的 RDS 表?

如何使用 ETL (AWS Glue) 聚合数据,以便我们可以使用 Athena 通过特定属性仅选择一部分数据

从 AWS Redshift 到 S3 的 AWS Glue ETL 作业失败

Python/Pyspark 迭代代码(用于 AWS Glue ETL 作业)