我想使用Java API在HDFS中移动文件。我无法想办法做到这一点。 FileSystem类似乎只允许允许移入和移出本地文件系统..但我想将它们保存在HDFS中并将它们移动到那里。
我错过了一些基本的东西吗?我能想到的唯一方法是从输入流中读取它并将其写回...然后删除旧副本(yuck)。
感谢
答案 0 :(得分:18)
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)