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