使用 Apache Spark 和 AWS 从每日 CSV 文件生成每月数据

Generating monthly data from daily CSV files using Apache Spark and AWS

我有 2018 年每一天的包含相同列和一百万个匹配 ID 的 CSV 文件。每个文件有 5 列,不包括 ID。

我想按月连接文件,这样每个月度文件都有 5 列 * 天数,因此 1 月将有 155 个名为 Day1-Col1、Day1-Col2...Day 31-Col5。

这是我可以用 Apache Spark 做的事情吗?

我选择 Spark 是因为我想将数据放入 AWS Athena 数据集中,而且 AWS Glue 似乎可以使用 Spark SQL 查询来做到这一点。

我想我们会先将 CSV 转换为 parquet 文件,然后生成一个月度数据集,稍后使用 AWS Quicksight 进行可视化。

Spark 将 I/O 从处理中分离出来。所以,我会在这里做同样的事情来解决这个问题。

首先,我会使用 AWS Glue Catalog 或 Spark 的原生 wholeTextFiles 方法加载您的 csv 文件。

从那里,您可以使用 AWS Glue 的 DynamicFrame 方法、Spark SQL 的 DataFrame 方法,或者您可以使用 Spark 的 RDD 函数进行数据处理。在这种情况下,您的大部分处理看起来是根据一年中的某天按月对数据进行分组。使用 RDD,您可以将 groupBy 方法与自定义函数一起使用,该自定义函数 returns 基于一年中某天的月份索引。同样,Spark SQL 的 Dataframe 也有一个 groupBy 方法。这里的另一种选择是在循环中迭代几个月,并根据一年中的某一天到月份过滤记录。在某些方面,for 循环更干净,而在其他方面则更脏。最后,执行此操作的第三种方法是向地图中的每条记录添加一个月份字段。这将允许您按月对数据进行分区,您可能还需要年份。

最后,把每个月都写回去就看你是怎么解决数据分组的了。如果您循环或添加月份字段进行分区,则可以使用 AWS Glue 目录写出文件。如果你做了 groupBy 那么你需要计算行数,repartition 到行数,然后使用 Spark 写入文件。