Hadoop 如何检查HDFS文件夹中是否有可用的avro文件?

Hadoop 如何检查HDFS文件夹中是否有可用的avro文件?,hadoop,apache-spark,Hadoop,Apache Spark,我在HDFS文件夹/user/data/output\u files/file\u 2017-10-18中有一些avro文件 scala> val hdfsLoc ="/user/data/output_files/file_2017-10-18/*.avro" hdfsLoc: String = /user/data/output_files/file_2017-10-18/*.avro scala> val conf = new Configuration() scala&

我在HDFS文件夹/user/data/output\u files/file\u 2017-10-18中有一些avro文件

scala> val hdfsLoc ="/user/data/output_files/file_2017-10-18/*.avro"
hdfsLoc: String = /user/data/output_files/file_2017-10-18/*.avro

scala>  val conf = new Configuration()

scala>   val fs  = FileSystem.get(conf)

scala> val result = fs.exists(new Path(hdfsLoc))
result: Boolean = false
以上代码给出的结果为false。它说HDFS文件夹中没有avro文件

如果我给出avro文件的全名,那么它将返回true

scala>  val hdfsLoc ="/user/data/output_files/file_2017-10-18/part-r-00000-ed937f14-c7d1-480a-9c79-1cda3db4e6ce.avro"
hdfsLoc: String = /user/data/output_files/file_2017-10-18/part-r-00000-ed937f14-c7d1-480a-9c79-1cda3db4e6ce.avro

scala> val result = fs.exists(new Path(hdfsLoc))
result: Boolean = true

如何确保HDFS文件夹中有一个或多个avro文件?

文件系统似乎不支持通配符。解决方法如下,尽管看起来很糟糕

 val list = fs.listFiles(new Path("/test/"), true)

 var result=false

 while(list.hasNext()){
   if(list.next().getPath.getName.endsWith(".avro"))
     result=true
 }

FileSystem
API有一个名为
globStatus
的不同函数,它允许您使用通配符

它返回
Array[org.apache.hadoop.fs.FileStatus]

val fs = FileSystem.get(Sc.hadoopConfiguration)

fs.globStatus(new Path("/user/data/output_files/file_2017-10-18/*.avro")).length match {
    case x: Int if (x>0) => doSomethingWhenAvroFileExists()
    case _ => doSomethingWhenNoAvroFilesExist()
}

如果avro文件是以前MapReduce或spark作业的结果,则可以在该文件夹中查找_SUCCESS文件。