【问题标题】:get size of parquet file in HDFS for repartition with Spark in Scala获取 HDFS 中 parquet 文件的大小,以便在 Scala 中使用 Spark 重新分区
【发布时间】:2016-03-03 12:13:36
【问题描述】:

我在 HDFS 上有许多 parquet 文件目录,每个目录包含数千个小(大多数

使用以下代码,我可以将本地 parquet 文件重新分区为更少的部分:

val pqFile = sqlContext.read.parquet("file:/home/hadoop/data/file.parquet")
pqFile.coalesce(4).write.save("file:/home/hadoop/data/fileSmaller.parquet")

但我不知道如何通过 Scala 代码以编程方式获取 HDFS 上目录的大小,因此我无法计算出要传递给真实数据集的 coalesce 函数的分区数。

我该怎么做?或者在 Spark 中是否有一种方便的方法,以便我可以配置 writer 以写入固定大小的 parquet 分区?

【问题讨论】:

    标签: scala hadoop apache-spark hdfs parquet


    【解决方案1】:

    你可以试试

    pqFile.inputFiles.size
    

    根据文档返回“组成此 DataFrame 的文件的尽力而为的快照”。

    作为替代方案,直接在 HDFS 级别:

    val hdfs: org.apache.hadoop.fs.FileSystem =
      org.apache.hadoop.fs.FileSystem.get(
        new org.apache.hadoop.conf.Configuration())
    
    val hadoopPath= new org.apache.hadoop.fs.Path("hdfs://localhost:9000/tmp")
    val recursive = false
    val ri = hdfs.listFiles(hadoopPath, recursive)
    val it = new Iterator[org.apache.hadoop.fs.LocatedFileStatus]() {
      override def hasNext = ri.hasNext
      override def next() = ri.next()
    }
    
    // Materialize iterator
    val files = it.toList
    println(files.size)
    println(files.map(_.getLen).sum)
    

    这样您也可以获得文件大小。

    【讨论】:

    • pqFile.inputFiles.size 只返回 parquet 目录中的文件数,我无法从中获取磁盘使用情况。 HDFS 解决方案有效。谢谢!
    • 不客气。我只是想涵盖有关“目录大小”的两种方式。
    • 太好了。我们如何在 pySpark 中做同样的事情?
    • @Ruslan 抱歉,无法使用 pySpark。
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 2017-08-07
    • 2017-09-05
    • 2021-02-14
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多