Hadoop權威指南:HDFS-目錄,查詢文件系統,刪除文件

Hadoop權威指南:HDFS-目錄,查詢文件系統,刪除文件

目錄

FileSystem實例提供了建立目錄的方法正則表達式

public boolean mkdirs(Path f) throws IOExceptionapache

這個方法一次性建立全部必要但尚未的父目錄編程

一般不須要顯式建立一個目錄,由於調用create()方法寫入文件時會自動建立全部父目錄數組

查詢文件系統

文件元數據:FileStatus

  • FileStatus類封裝了文件系統中文件和目錄的元數據包括文件長度,塊大小,副本,修改時間,全部者,權限信息
  • FileSystemgetFileStatus方法用於獲取文件或目錄的FileStatus對象
  • 使用exists()方法檢查文件或者目錄是否存在

列出文件

使用FileSystemlistStatus()方法bash

public FileStatus[] listStatus(Path f) throws IOException
public FileStatus[] listStatus(Path f, PathFilter filter) throws IOException
public FileStatus[] listStatus(Path[] files) throws IOException
public FileStatus[] listStatus(Path[] files, PathFilter filter) throws IOException
  • 傳入的Path參數能夠是一個文件,也能夠是一個目錄
  • 容許使用PathFilter來限制匹配的文件和目錄

顯示Hadoop文件系統中一組路徑的文件信息

代碼
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;

public class ListStatus {
    public static void main(String[] args) throws IOException {
        String uri = args[0];
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);

        Path[] paths = new Path[args.length];
        for (int i=0; i < paths.length; ++i) {
            paths[i] = new Path(args[i]);
        }
        FileStatus[] status = fs.listStatus(paths);
        // stat2Path2方法將一個FileStatus對象數組轉換爲一個Path對象數組
        Path[] listedPaths = FileUtil.stat2Paths(status);
        for (Path p : listedPaths) {
            System.out.println(p);
        }
    }
}
編譯

javac ListStatus.javaide

運行

hadoop ListStatus hdfs://localhost:9000/user/hadoop/input hdfs://localhost:9000/user/hadoop/outputoop

文件模式

Hadoop爲執行通配1提供了兩個FileSystem方法this

public FileStatus[] globStatus(Path pathPattern) throws IOException
public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException
  • globStatus()方法返回與其路徑匹配於指定模式的全部文件的FileStatus對象數組,並按路徑排序
  • PathFilter命令做爲可選項能夠進一步對匹配結果進行限制

Hadoop支持的通配符與Unix bash的相同.net

通配符 名稱 匹配
* 星號 匹配0或多個字符
? 問號 匹配單一字符
[ab] 字符類 匹配{a,b}集合中的一個字符
[^ab] 非字符類 匹配非{a,b}集合中的一個字符
[a-b] 字符範圍 匹配一個在a-b範圍內的字符(包括a,b),a在字典順序上要小於或等於b
[^a-b] 非字符範圍 匹配一個不在a-b範圍內的字符(包括a,b),a在字典順序上要小於或等於b
{a,b} 或選擇 匹配包含a或b中的一個的表達式
\c 轉義字符 匹配元字符c

PathFilter對象

  • 通配符模式並不總能描述咱們想要訪問的文件集
  • FileSystem中的listStatus()globStatus() 方法提供了可選的 PathFilter 對象, 以編程方式控制通配符
package org.apache.hadoop.fs;
  public interface PathFilter {
    boolean accept(Path path);
  }
  • pathFilterjava.io.FileFilter 同樣,是 Path 對象, 而不是 File 對象

PathFilter用於排除匹配正則表達式的路徑

代碼
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;

public class RegexExcludePathFilter implements PathFilter {

    private final String regex;

    public RegexExcludePathFilter(String regex) {
        this.regex = regex;
    }


    @Override
    public boolean accept(Path path) {
        return !path.toString().matches(regex);
    }
}

刪除數據

使用 FileSystemdelete() 方法能夠永久性刪除文件或目錄

public boolean delete(Path f, boolean recursive) throws IOException

  • 若是f是一個文件或空目錄, 那麼 recursive 的值會被忽略
  • 只有在 recursive 值爲 true 時,非空目錄及其內容纔會被刪除, 不然會拋出IOException異常

  1. 在一個表達式中使用通配符來匹配多個文件是比較方便的,無需列舉每一個文件和目錄來指定輸入,該操做稱爲"通配"

相關文章
相關標籤/搜索