2017-07-19 51 views
0

我想從spark/scala程序寫入json文件,然後將其讀入DataFrame中。這是我的代碼:java.io.FileNotFoundException:文件文件:/data/home/test/analysis.json不存在。在閱讀json時出現Spark錯誤

val analysisWriter = new BufferedWriter(new FileWriter("analysis.json")) 
for(i <- 0 to 10){ 
     val obj = arr.get(i).asInstanceOf[JSONObject] 
     currentAnalysis(""+obj.get("id")) 
    } 
    analysisWriter.close() 
    val df = hiveContext.read.json("file:///data/home/test/analysis.json") 
    df.show(10) 

    } 

    def currentAnalysis(id: String): Unit= { 
    val arrCurrentAnalysis: JSONObject = acc.getCurrentAnalysis(""+id) 

    if(arrCurrentAnalysis != null) { 
     analysisWriter.append(arrCurrentAnalysis.toString()) 
     analysisWriter.newLine() 
    } 

我收到以下錯誤,當我嘗試運行這段代碼:

java.io.FileNotFoundException: File file:/data/home/test/analysis.json does not exist 

我可以看到該文件在罐子裏(我運行的同一目錄中創建存在使用​​的罐子)。爲什麼代碼無法找到該文件?

起初,我是越來越java.io.IOException: No input paths specified in job

正如此間指出,Spark SQL "No input paths specified in jobs" when create DataFrame based on JSON file

這裏:Spark java.io.IOException: No input paths specified in job

我加file://的路徑來讀取JSON文件,現在我得到的FileNotFoundException

我在yarn羣集上運行spark 1.6。難道這種情況下,該文件是不可用的執行者,因爲它是在程序啓動後創建的?

回答

0

所以,我想我是對有關不提供給所有執行該文件。我能夠通過將文件複製到HDFS中的位置來解決此問題。我再也看不到這個錯誤了。我加了以下幾行代碼:

val fs = FileSystem.get(new URI("hdfs://nameservice1"), sc.hadoopConfiguration) 

fs.copyFromLocalFile(new Path("local_path"), new Path("hdfs_path")) 

,然後提供給hdfs_path hiveContext.read.json()

它能夠沒有任何問題創建數據框現在。

1

從我的理解,你的應用程序依賴於本地文件的一些業務邏輯。

我們可以通過引用file:///來讀取文件。但是爲了達到這個目的,文件的副本需要放在每個工作人員或每個工作人員需要訪問普通共享驅動器上,如NFS掛載。

所以要解決這個問題,你可以使用​​提供的--files標籤上傳文件到執行目錄。如果你有小文件不改變。

或者因爲其他建議把它在HDFS