java.io.FileNotFoundException:文件文件:/data/home/test/analysis.json不存在。读json

时间:2017-07-19 23:58:25

标签: java json scala apache-spark dataframe

我正在尝试从spark / scala程序编写一个json文件,然后将其读入DataFrame。这是我的代码:

 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

我可以看到正在创建的文件位于jar(我使用spark-submit运行jar)的同一目录中。为什么代码无法找到文件?

最初,我得到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

我正在spark 1.6群集上运行yarn。可能是因为文件在程序启动后创建的文件不可用吗?

3 个答案:

答案 0 :(得分:1)

据我所知,您的应用程序依赖于本地文件的某些业务逻辑。

我们可以通过将其称为file:///来读取该文件。但为了实现这一点,文件的副本需要在每个工作者上,或者每个工作者都需要访问公共共享驱动器,就像在NFS安装中一样。

因此,要解决此问题,您可以使用spark-submit提供--files标记将文件上载到执行目录。如果你有小文件没有改变。

或者其他人建议把它放在HDFS中

答案 1 :(得分: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()

现在可以毫无问题地创建Dataframe。

答案 2 :(得分:0)

当路径文件或文件名(即/ Folder1 / My Images / ...)中包含“空格”时,我们也会收到此错误消息。

java.io.FileNotFoundException: File file:/.../314_100.jpg does not exist

我的案例读取带有Spark的文件。 将“我的图像”替换为“我的图像”,应该没问题。