我正在尝试从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
。可能是因为文件在程序启动后创建的文件不可用吗?
答案 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的文件。 将“我的图像”替换为“我的图像”,应该没问题。