如何解决使用AWS Quicksight / Athena分析二进制NetCDF文件
我的任务是在Quicksight中分析天气预报数据。预测数据保存在公共S3存储桶中的NetCDF二进制文件中。问题是:如何将这些二进制文件的内容提供给Quicksight甚至Athena?
有些python库会解码二进制文件中的数据,例如Iris。它们的用法如下:
import iris
filename = iris.sample_data_path('forecast_20200304.nc')
cubes = iris.load(filename)
print(cubes)
那么创建数据提取管道所需的AWS工作流和服务将是什么:
- 响应SQS消息,即有新的二进制文件可用
- 访问新的二进制文件并对其进行解码以访问预测数据
- 将解码后的数据添加到先前SQS通知中已解码的数据中
- 让Athena / Quicksight中的所有解码数据可用
棘手的人,这个...
解决方法
我可能要做的就是这样:
在Python中编写一个Lambda函数,当新文件出现在S3存储桶中时触发-通过S3通知(如果您控制存储桶),通过SNS,SQS或EventBridge中的计划进行。该函数使用问题中包含的代码片段转换每个新文件,并将转换后的数据上传到另一个S3存储桶。
我不知道这些文件的大小以及它们的发布频率,因此您必须决定是否转换为CSV,JSON或Parquet –如果数据较小,CSV可能会最容易并且会足够好。
将转换后的数据存储在新的S3存储桶中,您要做的就是为数据集创建一个Athena表并开始使用QuickSight。
如果最终遇到很多小文件,则可能需要执行第二步,每天将转换后的文件合并为更大的文件,甚至可以合并为Parquet,但不要那样做,除非必须
另一种替代方法是使用Athena Federated Query:通过实现可响应Athena特定调用的Lambda函数,可以使Athena读取所需的任何数据源。目前处于预览阶段,据我所知所有示例代码都是用Java编写的-但从理论上讲,可以使用Python编写Lambda函数。
我不确定是否比实施您建议的ETL工作流程要少,但是您的工作流程是Athena Federated Query设计的用例之一,可能值得研究。如果NetCDF文件是通用文件,并且这些文件的数据源对其他人有用,那么我相信Athena团队很乐意与您交谈并为您提供帮助。