scala- 从 S3 存储桶读取文件

Posted

技术标签:

【中文标题】scala- 从 S3 存储桶读取文件【英文标题】:scala- Read file from S3 bucket 【发布时间】:2018-10-13 14:26:59 【问题描述】:

我想从 S3 存储桶中读取特定文件。在我的 S3 存储桶中,我将拥有如此多的对象(目录和子目录)。我想遍历所有对象并且必须只读取该文件。

我正在尝试以下代码:

val s3Client: AmazonS3Client = getS3Client()
    try 
      log.info("Listing objects from S3")
      var counter = 0

      val listObjectsRequest = new ListObjectsRequest()
        .withBucketName(bucketName)
        .withMaxKeys(2)
        .withPrefix("Test/"+"Client_cd" + "/"+"DM1"+"/")
        .withMarker("Test/"+"Client_cd" + "/"+"DM1"+"/")
      var objectListing: ObjectListing = null
      do 
        objectListing = s3Client.listObjects(listObjectsRequest)
        import scala.collection.JavaConversions._
        for (objectSummary <- objectListing.getObjectSummaries) 
          println( objectSummary.getKey + "\t" + StringUtils.fromDate(objectSummary.getLastModified))

        
          listObjectsRequest.setMarker(objectListing.getNextMarker())
        
        while (objectListing.isTruncated())

    
    catch 
      case e: Exception => 
        log.error("Failed listing files. ", e)
        throw e
      
    

在此路径中,我必须仅读取最新月份文件夹中的 .gz 文件。文件路径:

"Mybucket/Test/Client_cd/Dm1/20181010_xxxxx/*.gz"

在这里,我必须将 Client_cd 作为特定客户端的参数传递。

如何过滤对象并获取特定文件?

【问题讨论】:

您是否尝试过使用前缀“Test/Client_cd/Dm1/20181010_”而不在初始列表对象请求中提供标记?您必须在本地过滤结果才能仅获取 *.gz 文件(除非它们都是 *.gz 文件)。 嗨,如果您在我的图片中看到我有多个 client_cd 文件夹,我必须作为 client_cd 的参数传递(过滤),我必须在 DM1 下找到最近两个月的文件夹数据。 这里没有魔法可用。您可以读取前缀 Test/Client_cd/Dm1/201812,然后是 201811 等,一直到 201801,直到找到两个月实际有数据。 如果在这种情况下我可以从 dm1 读取所有数据。在 dm1 文件夹中,我将拥有 12 个月的数据。我只想要最近 2 个月的数据,并且每个月这些数据由系统自动生成。 如果 Dm1 下的文件不多,那么您可能只想列出所有文件,按日期降序排列,然后找到最近的两个月。如果有很多文件但它们都有一个共同的 YYYY 前缀,那么您可以从 12 月开始并向后工作(YYYY12 然后 YYYY11 等)。 【参考方案1】:

如果您使用的是 EMR 或您的 S3 配置设置正确,您也可以使用 sc.textFile("s3://bucket/Test/Client_cd/Dm1/20181010_xxxxx/*.gz")

【讨论】:

您好,感谢您提供详细信息。我能够从 S3 存储桶访问文件。如何递归读取数据?在 Dm1 文件夹中,我将拥有几个月的数据文件夹(假设 12 个月),在这些文件夹下,我拥有 *.gz 文件。我只想考虑最近两个月的数据,例如 (20181013,20180911..etc),我们必须执行自动化并且没有物理路径。 从多个路径读取文件的标准表达式应该可以工作。将 s3:// 视为文件读取协议,将 rest 视为文件路径。你可以像在本地文件系统上玩 ls 一样玩它。 @Dragonborn,感谢您的回复。是否可以通过编码实现?

以上是关于scala- 从 S3 存储桶读取文件的主要内容,如果未能解决你的问题,请参考以下文章

从 S3 存储桶中读取大量 CSV 文件

使用 Node 从 s3 存储桶中读取 txt 文件的内容

如何从 S3 存储桶中读取最后修改的 csv 文件?

Pyspark 从 S3 存储桶读取 csv 文件:AnalysisException:路径不存在

从 Azure 数据块读取 Amazon S3 特定文件夹,无需公开访问存储桶

如何从 S3 存储桶中仅读取最近 7 天的 csv 文件