我正在尝试从我的命令行EMR使用scala
获取一些S3文件夹的大小。
我将JSON数据作为GZ文件存储在S3中。我发现我可以计算我的文件中的JSON记录的数量:
spark.read.json("s3://mybucket/subfolder/subsubfolder/").count
但现在我需要知道这些数据占了多少GB。
我正在寻找不同文件的大小选项,但不是整个文件夹的大小。
发布于 2019-05-29 07:21:10
我正在寻找不同文件的大小选项,但不是整个文件夹的大小。
解决方案:
Option1:
通过FileSystem获取s3访问权限
val fs = FileSystem.get(new URI(ipPath), spark.sparkContext.hadoopConfiguration)
注意:
hadoop 1) new URI
很重要,否则它会连接到s3文件系统的路径instread (object store :-))路径。使用新的URI,您在这里为方案提供了s3://
。
2) org.apache.commons.io.FileUtils.byteCountToDisplaySize
将以GB MB等为单位显示文件系统的大小...
/**
* recursively print file sizes
*
* @param filePath
* @param fs
* @return
*/
@throws[FileNotFoundException]
@throws[IOException]
def getDisplaysizesOfS3Files(filePath: org.apache.hadoop.fs.Path, fs: org.apache.hadoop.fs.FileSystem): scala.collection.mutable.ListBuffer[String] = {
val fileList = new scala.collection.mutable.ListBuffer[String]
val fileStatus = fs.listStatus(filePath)
for (fileStat <- fileStatus) {
println(s"file path Name : ${fileStat.getPath.toString} length is ${fileStat.getLen}")
if (fileStat.isDirectory) fileList ++= (getDisplaysizesOfS3Files(fileStat.getPath, fs))
else if (fileStat.getLen > 0 && !fileStat.getPath.toString.isEmpty) {
println("fileStat.getPath.toString" + fileStat.getPath.toString)
fileList += fileStat.getPath.toString
val size = fileStat.getLen
val display = org.apache.commons.io.FileUtils.byteCountToDisplaySize(size)
println(" length zero files \n " + fileStat)
println("Name = " + fileStat.getPath().getName());
println("Size = " + size);
println("Display = " + display);
} else if (fileStat.getLen == 0) {
println(" length zero files \n " + fileStat)
}
}
fileList
}
根据您的需求,您可以修改代码...你可以把所有不同的文件加起来。
选项2:使用getContentSummary
简单易懂
implicit val spark = SparkSession.builder().appName("ObjectSummary").getOrCreate()
/**
* getDisplaysizesOfS3Files
* @param path
* @param spark [[org.apache.spark.sql.SparkSession]]
*/
def getDisplaysizesOfS3Files(path: String)( implicit spark: org.apache.spark.sql.SparkSession): Unit = {
val filePath = new org.apache.hadoop.fs.Path(path)
val fileSystem = filePath.getFileSystem(spark.sparkContext.hadoopConfiguration)
val size = fileSystem.getContentSummary(filePath).getLength
val display = org.apache.commons.io.FileUtils.byteCountToDisplaySize(size)
println("path = " + path);
println("Size = " + size);
println("Display = " + display);
}
注意:上面显示的任何选项也适用于本地、hdfs或s3
https://stackoverflow.com/questions/56350298
复制相似问题