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