如何以编程方式在hdfs中创建/触摸文件?

时间:2018-06-12 15:19:26

标签: java hadoop hdfs

有没有办法用Java创建hdfs中的文件?

类似于FileUtils类在apache commons中提供的内容。

如果我们touch已存在的文件,它会将上次修改时间更新为当前时间。如果文件不存在,它将创建一个空白文件,当前时间为最后修改时间。

2 个答案:

答案 0 :(得分:1)

java hadoop FileSystem api提供了这些类型的帮助程序。

这是一种为hdfs复制经典touch的方法:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FSDataOutputStream;
import java.io.IOException;

public static void touch(String filePath) throws IOException {

  FileSystem hdfs = FileSystem.get(new Configuration());

  Path fileToTouch = new Path(filePath);

  FSDataOutputStream fos = null;

  // If the file already exists, we append an empty String just to modify
  // the timestamp:
  if (hdfs.exists(fileToTouch)) {
    fos = hdfs.append(new Path(filePath));
    fos.writeBytes("");
  }
  // Otherwise, we create an empty file:
  else {
    fos = hdfs.create(new Path(filePath));
  }

  fos.close();
}

如果文件尚不存在,则会创建一个空文件:

hdfs.create(new Path(filePath)).close();

如果文件已存在,则将空字符串附加到文件中,以便修改时间戳:

hdfs.append(new Path(filePath)).writeBytes("");

答案 1 :(得分:0)

Configuration configuration = new Configuration();
FileSystem hdfs = FileSystem.get( new URI( "hdfs://localhost:54310" ), configuration );
Path file = new Path("hdfs://localhost:54310/s2013/batch/table.html");
if ( hdfs.exists( file )) { hdfs.delete( file, true ); } 
OutputStream os = hdfs.create( file,
    new Progressable() {
        public void progress() {
            out.println("...bytes written: [ "+bytesWritten+" ]");
        } });
BufferedWriter br = new BufferedWriter( new OutputStreamWriter( os, "UTF-8" ) );
br.write("Hello World");
br.close();
hdfs.close();