我有一个自定义分隔的输入文件,并传递给newAPIHadoopFile以转换为RDD [String]。该文件位于项目资源目录下。从Eclipse IDE运行时,以下代码运行良好。
val path = this.getClass()
.getClassLoader()
.getResource(fileName)
.toURI().toString()
val conf = new org.apache.hadoop.conf.Configuration()
conf.set("textinputformat.record.delimiter", recordDelimiter)
return sc.newAPIHadoopFile(
path,
classOf[org.apache.hadoop.mapreduce.lib.input.TextInputFormat],
classOf[org.apache.hadoop.io.LongWritable],
classOf[org.apache.hadoop.io.Text],
conf)
.map(_._2.toString)
然而,当我在spark-submit(使用超级jar)上运行它时如下
spark-submit /Users/anon/Documents/myUber.jar
我收到以下错误。
Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: jar:file:/Users/anon/Documents/myUber.jar!/myhome-data.json
请输入任何内容?
答案 0 :(得分:1)
如果该文件适用于需要路径而非输入流的sc.newAPIHadoopFile
,我建议您使用--files
的{{1}}选项。
- 文件FILES 要放在每个执行程序的工作目录中的以逗号分隔的文件列表。执行程序中这些文件的文件路径可以通过SparkFiles.get(fileName)访问。
请参阅SparkFiles.get方法:
获取通过
spark-submit
添加的文件的绝对路径。
有了这个,您应该使用SparkContext.addFile()
,如下所示:
spark-submit
在一般情况下,如果文件位于jar文件中,则应使用spark-submit --files fileNameHere /Users/anon/Documents/myUber.jar
来访问该文件(而不是直接作为InputStream
)。
代码可能如下所示:
File
请参阅Scala的Source对象和Java的ClassLoader.getResourceAsStream方法。