【问题标题】:Get latest AWS S3 folder when both folder and files inside folder created at same time boto3当文件夹和文件夹内的文件同时创建时获取最新的 AWS S3 文件夹 boto3
【发布时间】:2018-06-22 12:15:05
【问题描述】:

我正在尝试使用以下代码获取给定 s3 前缀中的最新文件夹

例如:

s3a://mybucket/data/timestamp=20180612165132/part1.parquete s3a://mybucket/data/timestamp=20180612165132/part2.parquete s3a://mybucket/data/timestamp=20180613165132/part1.parquete s3a://mybucket/data/timestamp=20180614165132/part1.parquete s3a://mybucket/data/timestamp=20180615165132/part1.parquete

我需要在数据文件夹下找到最新的时间戳文件夹..

  keys = []
  oldest = None

  kwargs = {'Bucket': bucket_name, 'Prefix': key}
  while True:
      resp = get_conn().list_objects_v2(**kwargs)
      for obj in resp['Contents']:
          keys.append({'Key': obj['Key'], 'LastModified': obj['LastModified']})

      try:
          kwargs['ContinuationToken'] = resp['NextContinuationToken']
      except KeyError:
          break

  logger.info("Got {0} keys".format(len(keys)))

  for key in keys:
      oldest = key['LastModified'] if oldest is None or key['LastModified'] < oldest else oldest

  return oldest

问题是我在每个时间戳文件夹下有 100 个文件,在上面我获取创建的每个文件的时间戳,在每个时间戳文件夹下查找最旧的文件以了解时间戳文件夹的创建日期

我使用此代码作为 s3 将整个事物视为 1 个对象

 s3a://mybucket/data/timestamp=20180612165132/part1.parquete

我无法获取时间戳文件夹的 LastModifiedDate

我觉得这非常昂贵,因为可能有数百个时间戳文件夹,每个文件夹有 100 个文件..

有没有最好的方法来实现这一点?

【问题讨论】:

  • 侧节点:文件夹实际上并不存在于 Amazon S3 中。它们“似乎”在那里,但可以在任何路径中创建对象,一旦删除,“文件夹”就会消失。一些系统会创建与文件夹同名的零长度文件,以强制文件夹“出现”。但是,此类文件的修改日期并不代表文件夹内容的修改日期(因为该文件夹不存在!)。
  • @JohnRotenstein 我明白没有文件夹的概念一切都是对象但是如何在我上面提到的 s3 位置列表中找到最新的时间戳文件夹?此外,如果我分别创建时间戳文件夹和文件夹内的文件,文件夹和文件被视为单独的对象,并且我能够在时间戳文件夹上获取 LastModifiedDate 但是当我同时创建它们时,除了上述之外,我没有其他方法
  • 您是指作为路径名称一部分的时间戳,还是在文件夹级别寻找一个神奇的时间戳,该时间戳在“文件夹”的内容更改时更新?
  • 我指的是作为路径名称一部分的时间戳,但总之我想知道所有时间戳文件夹中最新创建的文件夹,因为在我的情况下没有文件夹内的内容更新与内容一起创建一次
  • @JohnRotenstein 要添加更多上下文,我的 Spark 应用程序之一在 S3 中创建了此文件夹结构,我还有另一个应用程序需要获取 spark 应用程序生成的最新数据。如果您需要更多信息,请知道

标签: python-3.x amazon-s3 boto3


【解决方案1】:

正如 Josh 在 cmets 中所说:没有目录,所以没有目录时间戳。

工具只是组成它们,比如S3AFileStatus

一些想法

  1. 如果“文件夹”的名称中有时间戳,则列出后缀为“/”的父路径 ^ 查找时间戳最高的条目。
  2. 让每个查询在基本目录中写入一些索引文件,其中包含其目录的字符串。加载它,您将获得最新文件的名称。以后的作业将被覆盖。警告:S3 覆盖一致性意味着您可能获得旧版本,至少在短时间内(秒、数十秒,最坏情况下(通常))

选项 #2 可能是最快的

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 2023-03-28
    • 2020-07-26
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    相关资源
    最近更新 更多