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 存储桶读取文件的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark 从 S3 存储桶读取 csv 文件:AnalysisException:路径不存在