2016-06-19 32 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/「))」上面提到的是錯誤的。 –

相關問題