如何使用文件系统api计算分区数?

py49o6xq  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(332)

我使用的是hadoopversion2.7及其文件系统api。问题是关于“如何用api计算分区?”但是,要把它放到一个软件问题中,我在这里处理一个sparkshell脚本。。。关于剧本的具体问题是
变量 parts 下面是计算表分区的数量,还是其他的?

import org.apache.hadoop.fs.{FileSystem, Path}
import scala.collection.mutable.ArrayBuffer
import spark.implicits._

val warehouse = "/apps/hive/warehouse"  // the Hive default location for all databases
val db_regex  = """\.db$""".r   // filter for names like "*.db"
val tab_regex = """\.hive\-staging_""".r    // signature of Hive files

val trStrange = "[\\s/]+|[^\\x00-\\x7F]+|[\\p{Cntrl}&&[^\r\n\t]]+|\\p{C}+".r //mark
def cutPath (thePath: String, toCut: Boolean = true) : String =
  if (toCut) trStrange.replaceAllIn( thePath.replaceAll("^.+/", ""),  "@") else thePath

val fs_get = FileSystem.get( sc.hadoopConfiguration )
fs_get.listStatus( new Path(warehouse) ).foreach( lsb => {
    val b = lsb.getPath.toString
    if (db_regex.findFirstIn(b).isDefined) 
       fs_get.listStatus( new Path(b) ).foreach( lst => {
            val lstPath = lst.getPath
            val t = lstPath.toString
            var parts = -1
            var size = -1L
            if (!tab_regex.findFirstIn(t).isDefined) {
              try {
                  val pp = fs_get.listStatus( lstPath )
                  parts = pp.length // !HERE! partitions?
                  pp.foreach( p => {
                     try { // SUPPOSING that size is the number of bytes of table t
                        size  = size  + fs.getContentSummary(p.getPath).getLength
                     } catch { case _: Throwable => }
                  })
              } catch { case _: Throwable =>  }
              println(s"${cutPath(b)},${cutPath(t)},$parts,$size")
            }
        })
}) // x warehouse loop
System.exit(0)  // get out from spark-shell

这只是一个例子来说明重点:使用配置单元文件系统api对配置单元默认数据库文件系统结构进行正确的扫描和语义解释。脚本有时需要一些内存,但工作正常。跑步 sshell --driver-memory 12G --executor-memory 18G -i teste_v2.scala > output.csv 注意:这里的目的不是通过任何其他方法(例如hql)计算分区 DESCRIBE 或者spark模式),但是要使用api来实现它。。。对于控制和数据质量检查,api作为一种“低级测量”非常重要。

x8goxv8g

x8goxv8g1#

hive将其元数据结构为数据库>表>分区>文件。这通常转化为文件系统目录结构 <hive.warehouse.dir>/database.db/table/partition/.../files . 哪里 /partition/.../ 表示表可以由多个列进行分区,从而创建嵌套的子目录级别(分区是一个名为 .../partition_column=value 按惯例)。
所以看起来你的脚本将打印文件的数量( parts )以及它们的总长度( size )如果我没弄错的话,对于每个数据库中的每一个单列分区表。
作为替代,我建议你看看 hdfs dfs -count 命令来查看它是否适合您的需要,也许可以将它 Package 在一个简单的shell脚本中,以便在数据库和表之间循环。

相关问题