Я использую 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 с использованием Hive FileSystem API. Сценарию иногда требуется память, но он работает нормально. Бежать сsshell --driver-memory 12G --executor-memory 18G -i teste_v2.scala > output.csv
Примечание: цель здесь не в том, чтобы подсчитать разделы каким-либо другим способом (например, HQL DESCRIBE
или Spark Schema), а в том, чтобы использовать для него API ... Для управления идля проверок качества данных API важен как своего рода «измерение низкого уровня».