我在亚马逊S3上存储所有类型的文件。在亚马逊S3桶中,所有文件存储在不同的文件夹中,我知道亚马逊s3中没有文件夹的概念。对象仅由其键标识。如果我存储任何文件,如'mydocs / personal / profile-pic.jpg'那么意味着将在那里创建两个父文件夹(mydocs文件夹中的个人文件夹)。
我想计算java中'mydocs'之类的任何文件夹的大小。我使用下面给出的代码计算了桶总大小:
public long calculateBucketSize(String bucketName) {
long totalSize = 0;
int totalItems = 0;
ObjectListing objects = listObjects(bucketName);
do {
for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
totalSize += objectSummary.getSize();
totalItems++;
}
objects = listNextBatchOfObjects(objects);
} while (objects.isTruncated());
System.out.println("Amazon S3 bucket: " + bucketName + " containing "
+ totalItems + " objects with a total size of " + totalSize
+ " bytes.");
return totalSize;
}
此方法将返回存储桶总大小。我想计算任何单个文件夹的大小。任何帮助将不胜感激。
答案 0 :(得分:1)
对于Scala开发人员,这里使用官方AWS SDK for Java执行 完整扫描并映射 的AmazonS3存储桶内容的递归功能
import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}
def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {
def scan(acc:List[T], listing:ObjectListing): List[T] = {
val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
val mapped = (for (summary <- summaries) yield f(summary)).toList
if (!listing.isTruncated) mapped.toList
else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
}
scan(List(), s3.listObjects(bucket, prefix))
}
要调用上面的curry map()
函数,只需在第一个参数中传递已构造的(并且已正确初始化的)AmazonS3Client对象(请参阅官方AWS SDK for Java API Reference),存储桶名称和前缀名称名单。同时传递要应用的函数f()
以映射第二个参数列表中的每个对象摘要。
例如
val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))
将返回该存储桶/前缀
中(key, owner, size)
个元组的完整列表
或
map(s3, "bucket", "prefix")(s => s.getSize).sum
将返回该存储桶/前缀内容的总大小
您可以map()
将{{1}}与许多其他功能结合起来Monads in Functional Programming
答案 1 :(得分:1)
使用org.apache.hadoop lib有一个简单的方法
def calculateSize(path: String)(implicit spark: SparkSession): Long = {
val fsPath = new Path(path)
val fs = fsPath.getFileSystem(spark.sparkContext.hadoopConfiguration)
fs.getContentSummary(fsPath).getLength
}
此功能可以计算s3,hdfs和本地文件系统中的大小
答案 2 :(得分:0)
我认为您希望获得每个级别的文件夹大小。就像你有一个根文件夹R-Folder和两个子文件夹S1.1-Folder,S1.2-Folder然后S1.1-Folder再次有三个子文件夹S1.1.1-Folder,S1.1.2-Folder,S1。 1.3文件夹。现在您需要每个文件夹的文件夹大小
R-Folder (32MB)
|__S1.1-Folder (22MB)
| |__S1.1.1-Folder (7MB)
| |__S1.1.2-Folder (5MB)
| |__S1.1.3-Folder (10MB)
|
|__S1.2-FOlder (10MB)
我说错了吗?
您必须保留状态为isCompleted的列表文件夹详细信息 - 并递归扫描每个文件夹。当内部文件夹成功完成后,你必须更新其相应父级的大小,并且该父级将更新到相应的父级,并且每次都会继续直到root。
答案 3 :(得分:0)
遇到同样的问题,简单的解决方案是使用:
ObjectListing objects = listObjects(bucketName,prefix);
前缀是您的文件夹名称。
有关详细信息,请参阅此链接:
http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html