需求:
HDFS上的目录结构:20191001这个参数不是写死的,是外面传进去的
public static void rename(String time)
/ruozedata/20191001/a.txt
/ruozedata/20191001/b.txt
/ruozedata/20191001/c.txt
使用HDFS API完成如下格式的输出
/ruozedata/191001/1-20191001.txt
/ruozedata/191001/2-20191001.txt
/ruozedata/191001/3-20191001.txt
1.先在hdfs中创建目录,上传文件
2. code
package com.ruozedata.bigdata.hadoop.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.net.URI;
public class RenameApp {
private static Logger logger = Logger.getLogger(RenameApp.class);
private static final String HDFS_PATH = "hdfs://ruozedata:9000";
private static final String USER_NAME = "hadoop";
private static final String SRC_PATH = "/ruozedata/";
private static final String FILE_SUFFIX = ".txt";
private static FileSystem fileSystem;
private static Configuration conf;
public static void main(String[] args) {
String time = "20191001";
setup();
rename(time);
release();
}
/**
* 初始化FileSystem
*
* @throws Exception
*/
private static void setup() {
conf = new Configuration();
conf.set("dfs.replication", "1");
try {
fileSystem = FileSystem.get(new URI(HDFS_PATH), conf, USER_NAME);
} catch (Exception e) {
logger.error(e);
throw new RuntimeException(e);
}
}
/**
* 重命名文件
* 遍历指定目录下的文件
* 对每一个文件先拿到它的路径
* 再getParent()拿到文件夹的路径
* 根据传入的日期修改生成新的文件名字
* 有了文件夹/文件的路径,一次rename即可
*/
public static void rename(String time) {
String path = SRC_PATH + time;
int count = 1;
try {
RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path(path), false);
while (iterator.hasNext()) {
LocatedFileStatus fileStatus = iterator.next();
Path oldPath = fileStatus.getPath();
// 如果是文件且以 .txt 结尾
if (fileStatus.isFile() && oldPath.getName().endsWith(FILE_SUFFIX)) {
String newFileName = count + "-" + time + FILE_SUFFIX;
Path newPath = new Path(oldPath.getParent() + "/" + newFileName);
fileSystem.rename(oldPath, newPath);
count++;
}
}
} catch (IOException e) {
logger.error(e);
throw new RuntimeException(e);
}
}
/**
* 关闭资源
*/
private static void release() {
try {
fileSystem.close();
} catch (IOException e) {
logger.error(e);
}
}
}