我目前正在努力了解如何创建我们的数据湖(= Source)的数据目录。
背景:
我们具有事件驱动的体系结构,并开始将应用程序产生的所有事件存储到数据湖(S3存储桶)中。在存储事件之前,我们先对它们进行清理(删除敏感信息),并在每个事件周围添加一个信封,其中包含一些常规数据:
借助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 Jobs来聚合事件数据。据我了解,我需要为我的源数据提供一个数据目录,而这正是我在其中苦苦挣扎的地方,因为JSON总是包含不同的事件,这些事件被批处理在一起。标准的“ Crawler”无法处理此问题。它可以处理,但是会基于每个JSON文件创建无意义的模式。
我想要实现的目标:
我的问题
答案 0 :(得分:0)
让我尝试一下。
->您可以为每个事件展平json,然后将其导出到不同的S3存储桶中。在https://aws.amazon.com/blogs/big-data/simplify-querying-nested-json-with-the-aws-glue-relationalize-transform/
处参考一些python代码。->使用Glue抓取您的新存储桶并生成新的表架构,然后在Athena中您应该能够看到它并在表顶部进行过滤器/查询/聚合。对转换后的数据满意后,您可以将其进一步导入Redshift或RDS。
->在上面的Glue Catalog中,添加Redshift / RDS连接,然后使用Python Spark(需要一些有关使用数据框的基本知识)将数据加载到Redshift或RDS中。 https://www.mssqltips.com/sqlservertip/5952/read-enrich-and-transform-data-with-aws-glue-service/
->您可以安排Glue搜寻器从新存储桶中发现新数据。 另外,Lambda也是一个很好的选择。可以使用S3对象创建(带有扁平化json的新存储桶)触发Lambda进行预处理,ETL,然后将其插入Redshift / RDS(使用JDBC驱动程序)