【问题标题】:How to move Amazon S3 objects into partitioned directories如何将 Amazon S3 对象移动到分区目录中
【发布时间】:2019-10-05 00:31:18
【问题描述】:

以具有以下结构的 s3 存储桶为例,文件格式为 francescootti_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。我希望最终的 hive 表按天分区存储为 orc 文件。

最好的方法是什么?我设想了几种方法,可能是以下其中一种。

  1. 一个自动脚本,用于获取每小时文件并将它们移动到 s3 存储桶中相应的日期文件夹中。在这个新结构化的 s3 存储桶上创建分区外部表。

  2. 在原始 s3 位置顶部有一个外部 hive 表,并创建一个附加的分区 hive 表,该表从原始表插入。

各自的优缺点是什么?还有其他推荐吗?

【问题讨论】:

    标签: amazon-web-services hadoop amazon-s3 hive partition


    【解决方案1】:

    第一个选项:(一个自动脚本,用于获取每小时文件并将它们移动到 s3 存储桶中相应的天文件夹中。在这个新结构化的 s3 存储桶上创建分区外部表)看起来比在原始 s3 位置上构建文件更好因为原始位置包含太多文件并且查询会运行缓慢,因为即使您按 INPUT__FILE__NAME 虚拟列过滤,它也会列出所有文件如果您在其中收到新文件,那么情况会变得更糟。

    如果没有太多文件,比如原始文件夹中有数百个文件并且它没有增长,那么我会选择选项 2。

    选项一的可能缺点是移动文件的成本。**但无论如何,它比在同一个文件夹中读取/列出太多文件要好。

    所以,选项一看起来更好。

    其他建议: 重写上游进程,以便将文件写入日常文件夹。这是最好的选择。在这种情况下,您可以在 s3 顶级位置上构建表,并且每天只添加每日分区。分区修剪可以正常工作,您不需要移动文件,也不会出现 s3 中的不一致问题。

    【讨论】:

      【解决方案2】:

      您可以将 Amazon S3 事件配置为在 Amazon S3 存储桶中创建对象时自动触发 AWS Lambda 函数

      这个 Lambda 函数可以读取文件名(Key)并将对象移动到另一个目录(实际上,它会复制 + 删除对象)。

      这样,对象在创建后立即移动到所需位置。不需要批处理作业。

      但是,这不会改变文件的格式。可以使用 Amazon Athena 将内容转换为 Convert to Columnar Formats。这有点棘手,因为您需要指定源和目标。

      【讨论】:

        猜你喜欢
        • 2014-08-31
        • 2016-03-27
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        相关资源
        最近更新 更多