Подключитесь к папке HDFS из Azure блокнота данных, чтобы получить номер и размер файла - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь подключиться к местоположению hdfs из записной книжки базы данных, чтобы получить сведения о файле.

ниже приведен код, который я пытался получить таким же

%fs ls dbfs:/mnt/<mount>/dev/data/audit/

И я получил результат с размером, равным 0. И только подробности аудита папки, а не какой-либо из ее подпапок. enter image description here

В папке аудита есть еще 5 подпапок с файлами внутри. Я хочу получить количество файлов в каждой подпапке и общий размер этих 5 подпапок.

Я пробовал ниже dbutils в scala, но у него нет никакой функции, чтобы получить количество файлов или размер файла.

  1. Есть ли способ получить размер папок и подпапок в hdfs из записной книжки databricks?
  2. Есть ли способ получить количество файлов в папки и подпапки в hdfs из блокнота данных?

enter image description here

1 Ответ

0 голосов
/ 14 апреля 2020

В dbutils нет простого метода, который возвращает размер каталога или количество файлов в каталоге. Однако вы можете выполнять рекурсивные итерации каталогов.

1. Количество файлов рекурсивного расчета:

import scala.annotation.tailrec
import com.databricks.backend.daemon.dbutils.FileInfo
import com.databricks.dbutils_v1

private lazy val dbutils = dbutils_v1.DBUtilsHolder.dbutils

def numberOfFiles(location: String): Int = {
  @tailrec
  def go(items: List[FileInfo], result: Int): Int = items match {
    case head :: tail =>
      val files = dbutils.fs.ls(head.path)
      val directories = files.filter(_.isDir)
      go(tail ++ directories, result + files.size)
    case _ => result
  }

  go(dbutils.fs.ls(location).toList, 0)
}

2. Общий размер папки

import com.databricks.backend.daemon.dbutils.FileInfo

def sizeOfDirectory(location: String): Long = {
  @tailrec
  def go(items: List[FileInfo], result: Long): Long = items match {
    case head :: tail =>
      val files = dbutils.fs.ls(head.path)
      val directories = files.filter(_.isDir)
      val updated = files.map(_.size).foldLeft(result)(_ + _)
      go(tail ++ directories, updated)
    case _ => result
  }

  go(dbutils.fs.ls(location).toList, 0)
}

Надеюсь, это поможет

...