首页 > 解决方案 > AWS Glue:从具有混合数据的 Datalake(S3) 导入 JSON

问题描述

我目前正在努力了解如何创建我们的数据湖的数据目录(=Source)。

背景:

我们有一个事件驱动的架构,并开始将我们的应用程序产生的所有事件存储到数据湖(S3 Bucket)中。在存储事件之前,我们对其进行清理(删除敏感信息)并在每个事件周围添加一个包含一些通用数据的信封:

使用 Kinesis Streams 和 Firehose,我们将这些事件批处理在一起,并将它们作为 JSON 文件存储在 S3 存储桶中。存储桶的结构如下://///

在那里,我们将带有信封的批处理事件存储为 JSON 文件。这意味着一个 JSON 文件包含多个事件:

{
  "origin": "hummingbird",
  "type": "AuthenticationFailed",
  "timestamp": "2019-06-30T18:24:13.868Z",
  "correlation_id": "2ff0c077-542d-4307-a58b-d6afe34ba748",
  "data": {
    ...
  }
}
{
  "origin": "hummingbird",
  "type": "PostingCreated",
  "timestamp": "2019-06-30T18:24:13.868Z",
  "correlation_id": "xxxx",
  "data": {
    ...
  }
}

数据对象包含事件的特定数据。

现在我想我可以使用 AWS Glue 挂钩原始数据并使用 ETL 作业来聚合事件数据。据我了解,我需要为我的源数据建立一个数据目录,这就是我正在努力解决的问题,因为 JSON 总是包含不同的事件,这些事件是一起批处理的。标准的“爬虫”无法处理这个问题。它确实可以,但它会根据每个 JSON 文件创建无意义的模式。

我想要达到的目标:

我的问题:

标签: jsonaws-glueaws-glue-data-catalog

解决方案


让我试一试。

  1. 解析数据湖以过滤出我感兴趣的事件
  2. 使用我感兴趣的事件并对其进行一些转换/聚合/计算

--> 您可以将每个事件的 json 展平,然后将其导出到不同的 S3 存储桶中。在此处参考一些python代码https://aws.amazon.com/blogs/big-data/simplify-querying-nested-json-with-the-aws-glue-relationalize-transform/

--> 使用 Glue 抓取您的新存储桶并生成新的表模式,然后在 Athena 中您应该能够看到它并在表顶部执行过滤/查询/聚合。对转换后的数据感到满意后,您可以进一步将其导入 Redshift 或 RDS。

  1. 将结果存储到我们当前的 Analytics RDS 或任何地方(足以满足我们现在的目的)

--> 从上面的 Glue 目录中,添加 Redshift/RDS 连接,然后使用 Python Spark(需要一些使用数据帧的基本知识)将数据加载到 Redshift 或 RDS。 https://www.mssqltips.com/sqlservertip/5952/read-enrich-and-transform-data-with-aws-glue-service/

  1. 每天解析新事件并将其插入/附加/更新到我们的分析 rds

--> 您可以安排您的 Glue 爬虫从新存储桶中发现新数据。或者,Lambda 也是一个不错的选择。可以使用 S3 对象创建(带有扁平化 json 的新存储桶)触发 Lambda 到、预处理、ETL,然后插入到 Redshift/RDS(使用 JDBC 驱动程序)


推荐阅读