如何将 Amazon S3 对象移动到分区目录中
How to move Amazon S3 objects into partitioned directories
以具有以下结构的 s3 存储桶为例,其中包含以下形式的文件
francescototti_yyyy_mm_dd_hh.csv.gz:
例如:
francescototti_2019_05_01_00.csv.gz,
francescototti_2019_05_01_01.csv.gz,
francescototti_2019_05_01_02.csv.gz,
.....
francescototti_2019_05_01_23.csv.gz,
francescototti_2019_05_02_00.csv.gz
每个每小时文件大约 30 MB。我希望最终的配置单元 table 按天分区存储为 orc 文件。
最好的方法是什么?我想象了几种方法,可能是以下一种。
一个自动脚本,用于获取每天每小时的文件并将它们移动到 s3 存储桶中相应的日期文件夹中。在这个新结构化的 s3 存储桶上创建分区外部 table。
在原始 s3 位置之上有一个外部配置单元 table 并创建一个额外的分区配置单元 table 从原始 table 插入.
每个pros/cons是什么?还有其他推荐吗?
第一个选项:(一个自动脚本,用于获取每天每小时的文件并将它们移动到 s3 存储桶中相应的日期文件夹中。在此之上创建分区外部 table新结构的 s3 存储桶)看起来比在原始 s3 位置上构建文件更好因为原始位置包含太多文件并且查询会很慢,因为即使您按 INPUT__FILE__NAME 虚拟列过滤,它也会列出所有文件,如果您在其中接收到新文件,那么情况会变得更糟。
如果文件不是太多,比如 raw 文件夹中有数百个并且它没有增长,那么我会选择选项 2。
选项一的可能缺点是移动文件的成本。**但无论如何它比reading/listing同一文件夹中的太多文件要好。
所以,选项一看起来更好。
其他推荐:
重写上游进程,以便将文件写入日常文件夹。这是最好的选择。在这种情况下,您可以在 s3 顶级位置之上构建 table 并且每天只添加每日分区。分区修剪会很好地工作,你不需要移动文件,也没有 s3 中不一致的问题。
您可以将 Amazon S3 Events 配置为在 Amazon S3 存储桶中创建对象时自动触发 AWS Lambda 函数。
这个 Lambda 函数可以读取文件名 (Key) 并将对象移动到另一个目录(实际上,它会复制 + 删除对象)。
这样,对象一创建就被移动到所需的位置。无需批处理作业。
但是,这不会改变文件的格式。可以使用 Amazon Athena 将内容转换为 Convert to Columnar Formats。这有点棘手,因为您需要指定源和目标。
以具有以下结构的 s3 存储桶为例,其中包含以下形式的文件 francescototti_yyyy_mm_dd_hh.csv.gz:
例如:
francescototti_2019_05_01_00.csv.gz,
francescototti_2019_05_01_01.csv.gz,
francescototti_2019_05_01_02.csv.gz,
.....
francescototti_2019_05_01_23.csv.gz,
francescototti_2019_05_02_00.csv.gz
每个每小时文件大约 30 MB。我希望最终的配置单元 table 按天分区存储为 orc 文件。
最好的方法是什么?我想象了几种方法,可能是以下一种。
一个自动脚本,用于获取每天每小时的文件并将它们移动到 s3 存储桶中相应的日期文件夹中。在这个新结构化的 s3 存储桶上创建分区外部 table。
在原始 s3 位置之上有一个外部配置单元 table 并创建一个额外的分区配置单元 table 从原始 table 插入.
每个pros/cons是什么?还有其他推荐吗?
第一个选项:(一个自动脚本,用于获取每天每小时的文件并将它们移动到 s3 存储桶中相应的日期文件夹中。在此之上创建分区外部 table新结构的 s3 存储桶)看起来比在原始 s3 位置上构建文件更好因为原始位置包含太多文件并且查询会很慢,因为即使您按 INPUT__FILE__NAME 虚拟列过滤,它也会列出所有文件,如果您在其中接收到新文件,那么情况会变得更糟。
如果文件不是太多,比如 raw 文件夹中有数百个并且它没有增长,那么我会选择选项 2。
选项一的可能缺点是移动文件的成本。**但无论如何它比reading/listing同一文件夹中的太多文件要好。
所以,选项一看起来更好。
其他推荐: 重写上游进程,以便将文件写入日常文件夹。这是最好的选择。在这种情况下,您可以在 s3 顶级位置之上构建 table 并且每天只添加每日分区。分区修剪会很好地工作,你不需要移动文件,也没有 s3 中不一致的问题。
您可以将 Amazon S3 Events 配置为在 Amazon S3 存储桶中创建对象时自动触发 AWS Lambda 函数。
这个 Lambda 函数可以读取文件名 (Key) 并将对象移动到另一个目录(实际上,它会复制 + 删除对象)。
这样,对象一创建就被移动到所需的位置。无需批处理作业。
但是,这不会改变文件的格式。可以使用 Amazon Athena 将内容转换为 Convert to Columnar Formats。这有点棘手,因为您需要指定源和目标。