Попытка скопировать данные из нескольких папок 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