首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在电子病历中使用Spark Scala获取S3对象大小(文件夹、文件)

在电子病历中使用Spark Scala获取S3对象大小(文件夹、文件)
EN

Stack Overflow用户
提问于 2019-05-29 05:32:31
回答 1查看 1.5K关注 0票数 4

我正在尝试从我的命令行EMR使用scala获取一些S3文件夹的大小。

我将JSON数据作为GZ文件存储在S3中。我发现我可以计算我的文件中的JSON记录的数量:

代码语言:javascript
复制
spark.read.json("s3://mybucket/subfolder/subsubfolder/").count

但现在我需要知道这些数据占了多少GB。

我正在寻找不同文件的大小选项,但不是整个文件夹的大小。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-29 07:21:10

我正在寻找不同文件的大小选项,但不是整个文件夹的大小。

解决方案:

Option1:

通过FileSystem获取s3访问权限

代码语言:javascript
复制
    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等为单位显示文件系统的大小...

代码语言:javascript
复制
      /**
    * 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简单易懂

代码语言:javascript
复制
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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56350298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档