使用Java API在Hadoop中移动文件?

时间:2011-03-31 23:58:10

标签: java hadoop hdfs

我想使用Java API在HDFS中移动文件。我无法想办法做到这一点。 FileSystem类似乎只允许允许移入和移出本地文件系统..但我想将它们保存在HDFS中并将它们移动到那里。

我错过了一些基本的东西吗?我能想到的唯一方法是从输入流中读取它并将其写回...然后删除旧副本(yuck)。

感谢

4 个答案:

答案 0 :(得分:18)

使用FileSystem.rename()

public abstract boolean rename(Path src, Path dst) throws IOException
     

将路径src重命名为路径dst。可以在本地fs或远程DFS上进行。

     

<强>参数:
  src - 要重命名的路径
  dst - 重命名后的新路径
  的返回:
  如果重命名成功,则true   的抛出:
  IOException - 失败

答案 1 :(得分:4)

java.nio。*方法可能无法在HDFS上运行。所以找到了以下解决方案。

使用org.apache.hadoop.fs.FileUtil.copy API将文件从一个目录移动到另一个目录

val fs = FileSystem.get(new Configuration())
        val conf = new org.apache.hadoop.conf.Configuration()
        val srcFs = FileSystem.get(new org.apache.hadoop.conf.Configuration())
        val dstFs = FileSystem.get(new org.apache.hadoop.conf.Configuration())
        val dstPath = new org.apache.hadoop.fs.Path(DEST_FILE_DIR)

        for (file <- fileList) {
          // The 5th parameter indicates whether source should be deleted or not
          FileUtil.copy(srcFs, file, dstFs, dstPath, true, conf)

答案 2 :(得分:1)

我认为FileUtilts replaceFile也可以解决目的。 http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileUtil.html#replaceFile(java.io.File,java.io.File)

答案 3 :(得分:0)

import re

content = "{'id: 'id-::blabla1::blabal2-A'}"
pattern = re.compile('{\'id: \'id-::blabla.*?::blabal.*?-(.*?)\'}', re.S)
print re.findall(pattern, content)