Скопируйте несколько каталогов HDFS в один, используя глобальный путь с Java API - PullRequest
0 голосов
/ 05 октября 2019

Попытка скопировать данные из нескольких папок hdfs в другую. Исходные пути определены с помощью glob. Выполняю работу в цикле. Все работает отлично, кроме последней папки: перемещается только ее содержимое, а не вложенная папка.

/hdfs
  /destination
    /monthly
      /date=2019-10-01/
        _SUCCESS
        2019-10-01.parquet
      _SUCCESS
      2019-09-01.parquet

Копирование с hdfs dfs -cp /hdfs/monthly/date={2019-09,2019-10}-?? /hdfs/destination/monthly работает как положено.

Исходный путь, определенный следующим образом

val sourcePath = "/hdfs/monthly/date={2019-09,2019-10}-??"

Путь назначения выглядит следующим образом:

val destinationPath = "/hdfs/destination/monthly"

В приведенном ниже коде у меня есть log.warn сообщение "Не каталог". Этого никогда не происходит.

def copyFolder(sourcePath: String, destinationPath: String): Unit = {
  deleteDir(destinationPath)
  log.debug(s"Copying directory '$sourcePath' to '$destinationPath'")
  val source = new Path(sourcePath)
     val firstLevelPathFilter = new PathFilter {
    override def accept(path: Path): Boolean = {
      log.info(s"Source depth = ${source.getParent.depth()}, path depth = ${path.depth()}")
      log.info(s"Parent path: ${source.getParent.toString}")
      log.info(s"Item path: ${path.toString}")
      source.getParent.depth() + 1 == path.depth()
    }
  }
     val partitionsStatuses = fs.globStatus(source, firstLevelPathFilter)
  val partitionFolders = FileUtil.stat2Paths(partitionsStatuses)
  val destination = new Path(destinationPath)
  partitionFolders.foreach(p => {
    log.info(s"Copying path $p")
    if (fs.isDirectory(p)) {
      FileUtil.copy(fs, p, fs, destination, false, configuration)
    } else {
      log.warn(s"Not a directory $p")
    }
  })
}

Я хочу скопировать несколько каталогов с их содержимым в другой каталог с помощью HDFS Java API, как это делает утилита hdfs dfs -cp:

/hdfs
  /destination
    /monthly
      /date=2019-10-01/
        _SUCCESS
        2019-10-01.parquet
      /date=2019-09-01/
        _SUCCESS
        2019-09-01.parquet
...