2016-06-19 34 views
2

如何枚举HDFS目录中的文件?这是用于使用Scala枚举Apache Spark群集中的文件。我看到有sc.textfile()选项,但它会读取内容。我只想读取文件名。如何枚举HDFS目录中的文件

其实我试过listStatus。但没有奏效。获取下面的错误。 我使用的是Azure HDInsight Spark,blob存储文件夹“[email protected]/example/”包含.json文件。

val fs = FileSystem.get(new Configuration()) 
val status = fs.listStatus(new Path("wasb://[email protected]/example/")) 
status.foreach(x=> println(x.getPath) 

========= 
Error: 
======== 
java.io.FileNotFoundException: Filewasb://[email protected]/example does not exist. 
    at org.apache.hadoop.fs.azure.NativeAzureFileSystem.listStatus(NativeAzureFileSystem.java:2076) 
    at $iwC$$iwC$$iwC$$iwC.<init>(<console>:23) 
    at $iwC$$iwC$$iwC.<init>(<console>:28) 
    at $iwC$$iwC.<init>(<console>:30) 
    at $iwC.<init>(<console>:32) 
    at <init>(<console>:34) 
    at .<init>(<console>:38) 
    at .<clinit>(<console>) 
    at .<init>(<console>:7) 
    at .<clinit>(<console>) 
    at $print(<console>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065) 
    at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1346) 
    at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840) 
    at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871) 
    at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819) 
    at com.cloudera.livy.repl.scalaRepl.SparkInterpreter$$anonfun$executeLine$1.apply(SparkInterpreter.scala:272) 
    at com.cloudera.livy.repl.scalaRepl.SparkInterpreter$$anonfun$executeLine$1.apply(SparkInterpreter.scala:272) 
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57) 
    at scala.Console$.withOut(Console.scala:126) 
    at com.cloudera.livy.repl.scalaRepl.SparkInterpreter.executeLine(SparkInterpreter.scala:271) 
    at com.cloudera.livy.repl.scalaRepl.SparkInterpreter.executeLines(SparkInterpreter.scala:246) 
    at com.cloudera.livy.repl.scalaRepl.SparkInterpreter.execute(SparkInterpreter.scala:104) 
    at com.cloudera.livy.repl.Session.com$cloudera$livy$repl$Session$$executeCode(Session.scala:98) 
    at com.cloudera.livy.repl.Session$$anonfun$3.apply(Session.scala:73) 
    at com.cloudera.livy.repl.Session$$anonfun$3.apply(Session.scala:73) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

谢谢!

+0

请阅读HDFS API文档,尝试一些和后你试过了什么! – eliasah

+0

我不明白你为什么试过spark api。因为你必须看看hdfs api和scala语法来做到这一点。由于@eliasah建议请在SO –

回答

3

,这是失败的原因是因为它实际上是在寻找你的默认存储容器而不是testContainer,因此找不到示例文件夹。您可以通过将路径更改为wasb://[email protected]/来查看它,并且它将列出来自不同容器的文件。

我不知道这是为什么,但我发现,你可以通过该路径FileSystem.get呼叫这样的修正:

val fs = FileSystem.get(new java.net.URI("wasb://[email protected]/example/"), new Configuration()) 
val status = fs.listStatus(new Path("wasb://[email protected]/example/")) 
status.foreach(x=> println(x.getPath) 
+0

是的,这个工程! – vijay

2

see FileSystem class

抽象时间filestatus [] listStatus(路F)

列表中给定的路径中的文件/目录的状态,如果 路径是一个目录。

val fs = FileSystem.get(new Configuration()) 
val status = fs.listStatus(new Path(HDFS_PATH)) 
status.foreach(x=> println(x.getPath) 

注:HDFS API,您可以从如Java或低于斯卡拉任何语言来访问是Java示例以及

/** 
    * Method listFileStats. 
    * 
    * @param destination 
    * @param fs 
    * @throws FileNotFoundException 
    * @throws IOException 
    */ 
    public static void listFileStats(final String destination, final FileSystem fs) throws FileNotFoundException, IOException { 
     final FileStatus[] statuss = fs.listStatus(new Path(destination)); 
     for (final FileStatus status : statuss) { 
      LOG.info("-- status {} ", status.toString()); 
      LOG.info("Human readable size {} of file ", FileUtils.byteCountToDisplaySize(status.getLen())); //import org.apache.commons.io.FileUtils; 
     } 
    } 
} 
+0

之前来做一些基础工作(阅读api基础知识),然后问问listFileStatus似乎不适用于Azure HDInsight。用错误详细信息更新了原始问题。 – vijay

+0

你使用的是什么版本的hadoop –

+0

做hadoop fs -ls -R 然后根据你修改你的路径。显然......“新路径(”wasb://[email protected]/example/“))”上面提到的是错误的。 –

相关问题