Java Hadoop中的通配符';s文件系统列出API调用

Java Hadoop中的通配符';s文件系统列出API调用,java,hadoop,hdfs,wildcard,Java,Hadoop,Hdfs,Wildcard,tl;dr:要在列出的路径中使用通配符(glob),只需使用而不是 上下文 我的HDFS集群上的文件是按分区组织的,日期是“根”分区。文件结构的简化示例如下所示: /schemas_folder ├── date=20140101 │   ├── A-schema.avsc │   ├── B-schema.avsc ├── date=20140102 │   ├── A-schema.avsc │   ├── B-schema.avsc │   ├── C-schema.avsc └── d

tl;dr:
要在列出的路径中使用通配符(glob),只需使用而不是


上下文 我的HDFS集群上的文件是按分区组织的,日期是“根”分区。文件结构的简化示例如下所示:

/schemas_folder
├── date=20140101
│   ├── A-schema.avsc
│   ├── B-schema.avsc
├── date=20140102
│   ├── A-schema.avsc
│   ├── B-schema.avsc
│   ├── C-schema.avsc
└── date=20140103
    ├── B-schema.avsc
    └── C-schema.avsc
FileStatus[] statuses = filesystem.globStatus(new Path("/schemas_folder/date=*/A-schema.avsc"));
for (FileStatus status : statuses)
{
    System.out.println(status.getPath());
}
在我的例子中,目录在不同的日期存储不同类型数据(本例中为A、B和C)的模式。架构可能开始存在、演变并停止存在。。。随着时间的推移


目标 我需要能够尽快获得给定类型的所有模式。在我想要获取类型A的所有架构的示例中,我想要执行以下操作:

hdfs dfs -ls /schemas_folder/date=*/A-schema.avsc
那会给我

Found 1 items
-rw-r--r--   3 user group 1234 2014-01-01 12:34 /schemas_folder/date=20140101/A-schema.avsc
Found 1 items
-rw-r--r--   3 user group 2345 2014-01-02 23:45 /schemas_folder/date=20140102/A-schema.avsc

问题 我不想使用shell命令,而且在JavaAPI中似乎找不到与上述命令等效的命令。当我尝试自己实现循环时,我得到了糟糕的性能。我至少希望命令行的性能(在我的情况下大约3秒)


到目前为止我发现了什么 可以注意到,它在每个结果之前打印两次
found1 items
。它不会在开始时一次打印
Found 2个项目
。这可能暗示通配符不是在
文件系统
端实现的,而是由客户端处理的。我似乎找不到合适的源代码来查看它是如何实现的

下面是我的第一张照片,可能有点太天真了

使用列表文件(…) 代码:
这是迄今为止我能想到的外观最好、性能最好的代码,但性能仍然不如shell版本。

您可以尝试hadoops globStatus而不是listStatus。Hadoop为处理glob提供了两种文件系统方法:

public FileStatus[] globStatus(Path pathPattern) throws IOException
public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException
可以指定可选的PathFilter来进一步限制匹配

有关更多说明,请查看Hadoop:Definitive Guide


希望对你有帮助

这听起来很完美,我会尽快接受我的测试,如果它工作!你最终找到了一个更有效的方法来运行它吗
globStatus
对我来说也比shell花费了大量的时间/@我没有(
FileStatus[] statuses = filesystem.globStatus(new Path("/schemas_folder/date=*/A-schema.avsc"));
for (FileStatus status : statuses)
{
    System.out.println(status.getPath());
}
public FileStatus[] globStatus(Path pathPattern) throws IOException
public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException