我正在使用Hadoop 2.7版及其FileSystem API。问题是关于“如何使用API计算分区数量?”,但是,将其放入软件问题中,我要在这里处理一个Spark-Shell脚本...有关脚本的具体问题是
下面的变量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
这只是一个显示焦点的示例:使用Hive FileSystem API对Hive默认数据库 FileSystem结构进行正确的扫描和语义解释。该脚本有时需要一些内存,但工作正常。使用sshell --driver-memory 12G --executor-memory 18G -i teste_v2.scala > output.csv
运行>
注意:此处的目的不是通过任何其他方法(例如HQL DESCRIBE
或Spark Schema)对分区进行计数,而是对其使用API ...对于控制和data quality
我正在使用Hadoop 2.7版及其FileSystem API。问题是“如何用API计算分区数”?但是,为了解决软件问题,我在这里处理一个Spark-Shell脚本... ...
Hive将其元数据构造为数据库>表>分区>文件