hadoop递归连接文件以保持目录结构

vsaztqbk  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(446)

我想在一个目录下添加两个目录的文件,同时维护目录结构。
我有目录1和目录2,每个目录都有大约80个子目录,结构如下所示。
hdfs上的目录1:
/用户/hadoop/1//file11
/user/hadoop/1/def/file12
/用户/hadoop/1/ghi/file13
/用户/hadoop/1/jkl/file14
/user/hadoop/1/mno/file15
hdfs上的目录2:
/用户/hadoop/2//file26
/用户/hadoop/2/ghi/file27
/用户/hadoop/2/mno/file28
我想将dir1的文件11和dir2的文件26合并到一个目录下,dir1的文件13和dir27以此类推。目标目录是目录1。
从目录2添加到目录1的文件应与子目录的路径匹配。
期望输出:
/user/hadoop/1//file11,/user/hadoop/1//file26
/user/hadoop/1/def/file12
/user/hadoop/1/ghi/file13,/user/hadoop/1/ghi/file27
/用户/hadoop/1/jkl/file14
/user/hadoop/1/mno/file15,/user/hadoop/1/mno/file28
感谢您的帮助。

dfty9e19

dfty9e191#

使用 org.apache.hadoop.fs.FileUtil 应用程序编程接口
你得到了吗 FileSystem 带以下api

final FileSystem fs = FileSystem.get(conf);

复制
公共静态布尔复制(filesystem srcfs,path[]srcs,filesystem dstfs,path dst,boolean deletesource,boolean overwrite,conf)抛出ioexception抛出:ioexception
此方法在文件系统之间复制文件。
替换文件 FileUtil.replaceFile(File src, File target) 也应该有用
请参阅此方法的文档“将src文件移到target指定的名称”
在这两种情况下,您都需要列出您的公用文件夹/user/hadoop/2///user/hadoop/1//,方法是在第三个斜杠字符后进行比较,以及它们是否匹配复制源和目标,或者根据您的要求开发逻辑(我将把它留给您:-)
复制到所需目标后:您可以使用下面的示例方法在流上看到它们

/**
         * 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());
            }
        }
drkbr07n

drkbr07n2#

我将为目录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

相关问题