我想在一个目录下添加2个目录的文件,同时保持目录结构。
我有目录1和目录2,每个目录有大约80个子目录,结构如下所示。
HDFS上的目录1:
HDFS上的目录2:
我想将目录1的file11和目录2的文件26组合在单个目录下,目录1的文件13和目录27中,依此类推。 目标目录是目录1。
从dir 2添加到dir 1的文件应该与子目录的路径匹配。
期望的输出:
感谢任何帮助。
答案 0 :(得分:1)
使用org.apache.hadoop.fs.FileUtil
API
您获得FileSystem
以下API
final FileSystem fs = FileSystem.get(conf);
复制强>
public static boolean copy(FileSystem srcFS, Path [] srcs, FileSystem dstFS, 路径dst, boolean deleteSource, 布尔覆盖, 配置conf) 抛出IOException 抛出: IOException的
此方法在FileSystems之间复制文件。
FileUtil.replaceFile(File src, File target)
也应该有用请参阅此方法的文档“将src文件移动到目标指定的名称。”
在任何一种情况下,您都需要通过比较后列出您的公共文件夹 / user / hadoop / 2 / abc / / user / hadoop / 1 / abc / 斜线字符,如果它们匹配复制源到目标或根据您的要求开发逻辑(我将留给您: - ))
复制到所需目标后:您可以使用以下示例方法
在流程中看到它们/**
* Method listFileStats.
*
* @param destination
* @param fs
* @throws FileNotFoundException
* @throws IOException
*/
public static void listFileStats(final String destination, final FileSystem fs) throws FileNotFoundException, IOException {
final FileStatus[] statuss = fs.listStatus(new Path(destination));
for (final FileStatus status : statuss) {
///below log are sl4j you can use other loggers..
LOG.info("-- status {} ", status.toString());
}
}
答案 1 :(得分:0)
我为目录2下的每个文件获取一个唯一的文件名,并添加到目录1下的右子目录中。 以下是剧本:
for file in $(hadoop fs -ls /user/hadoop/2/* | grep -o -e "/user/hadoop/2/.*") ; do
subDir=$(echo $file | cut -d '/' -f 5)
fileName=$(echo $file | cut -d '/' -f 6)
uuid=$(uuidgen)
newFileName=$fileName"_"$uuid
hadoop fs -cp $file /user/hadoop/1/$subDir/$newFileName
done