Hadoop以递归方式连接文件以维护目录结构

时间:2016-06-03 14:25:57

标签: file hadoop path filesystems hdfs

我想在一个目录下添加2个目录的文件,同时保持目录结构。

我有目录1和目录2,每个目录有大约80个子目录,结构如下所示。

HDFS上的目录1:

  • /用户/ hadoop的/ 1 / ABC / FILE11
  • /用户/ hadoop的/ 1 / DEF / file12
  • /用户/ hadoop的/ 1 / GHI / file13
  • /用户/ hadoop的/ 1 / JKL / FILE14
  • /用户/ hadoop的/ 1 / MNO / file15

HDFS上的目录2:

  • /用户/ hadoop的/ 2 / ABC / file26
  • /用户/ hadoop的/ 2 / GHI / file27
  • /用户/ hadoop的/ 2 / MNO / file28

我想将目录1的file11和目录2的文件26组合在单个目录下,目录1的文件13和目录27中,依此类推。 目标目录是目录1。

从dir 2添加到dir 1的文件应该与子目录的路径匹配。

期望的输出:

  • / user / hadoop / 1 / abc / file11,/ user / hadoop / 1 / abc / file26
  • /用户/ 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

感谢任何帮助。

2 个答案:

答案 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