このglobStatus
メソッドは、ファイルをフィルタリングできるようにする 2 つの補完的な引数を取ります。1 つ目は glob パターンですが、特定のファイルをフィルタリングするには glob パターンが十分に強力でない場合がありますPathFilter
。
glob パターンに関しては、以下がサポートされています。
Glob | Matches
-------------------------------------------------------------------------------------------------------------------
* | Matches zero or more characters
? | Matches a single character
[ab] | Matches a single character in the set {a, b}
[^ab] | Matches a single character not in the set {a, b}
[a-b] | Matches a single character in the range [a, b] where a is lexicographically less than or equal to b
[^a-b] | Matches a single character not in the range [a, b] where a is lexicographically less than or equal to b
{a,b} | Matches either expression a or b
\c | Matches character c when it is a metacharacter
PathFilter
は、次のような単純なインターフェイスです。
public interface PathFilter {
boolean accept(Path path);
}
したがって、このインターフェイスを実装し、accept
ロジックを配置してファイルをフィルター処理できるメソッドを実装できます。
特定の正規表現に一致するファイルをフィルタリングするように定義できるTom Whiteの優れた本からの例:PathFilter
public class RegexExcludePathFilter implements PathFilter {
private final String regex;
public RegexExcludePathFilter(String regex) {
this.regex = regex;
}
public boolean accept(Path path) {
return !path.toString().matches(regex);
}
}
ジョブを初期化するときにPathFilter
呼び出すことにより、実装で入力を直接フィルタリングできます。FileInputFormat.setInputPathFilter(JobConf, RegexExcludePathFilter.class)
編集: でクラスを渡す必要がsetInputPathFilter
あるため、引数を直接渡すことはできませんが、Configuration
. RegexExcludePathFilter
も拡張する場合は、以前に初期化Configured
したConfiguration
オブジェクトを目的の値で取得できるため、これらの値をフィルター内で取得して で処理できますaccept
。
たとえば、次のように初期化する場合:
conf.set("date", "2013-01-15");
次に、次のようにフィルターを定義できます。
public class RegexIncludePathFilter extends Configured implements PathFilter {
private String date;
private FileSystem fs;
public boolean accept(Path path) {
try {
if (fs.isDirectory(path)) {
return true;
}
} catch (IOException e) {}
return path.toString().endsWith(date);
}
public void setConf(Configuration conf) {
if (null != conf) {
this.date = conf.get("date");
try {
this.fs = FileSystem.get(conf);
} catch (IOException e) {}
}
}
}
編集 2 : 元のコードにはいくつかの問題がありました。更新されたクラスを参照してください。また、コンストラクターはもう使用されていないため削除する必要があります。また、それがディレクトリであるかどうかを確認する必要があります。その場合、ディレクトリの内容もフィルタリングできるように true を返す必要があります。