Как считать разделы с помощью FileSystem API? - PullRequest
1 голос
/ 23 октября 2019

Я использую 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 важен как своего рода «измерение низкого уровня».

1 Ответ

1 голос
/ 23 октября 2019

Hive структурирует свои метаданные как база данных> таблицы> разделы> файлы . Обычно это приводит к структуре каталогов файловой системы <hive.warehouse.dir>/database.db/table/partition/.../files. Где /partition/.../ означает, что таблицы могут быть разделены на несколько столбцов, создавая вложенные уровни подкаталогов. (A раздел - это каталог с именем .../partition_column=value по соглашению).

Похоже, ваш сценарий будет печатать количество файлов (parts) и их общую длину (size) для каждой разделенной на один столбец таблицы в каждой из ваших баз данных, если я неошибается.

В качестве альтернативы я бы посоветовал вам взглянуть на команду hdfs dfs -count, чтобы убедиться, что она соответствует вашим потребностям, и, возможно, обернуть ее в простой сценарий оболочки для циклического просмотра баз данных и таблиц. .

...