3

我有一个自定义分隔的输入文件,并传递给 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(使用 uber 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

请问有什么输入吗?

4

1 回答 1

1

如果文件为此sc.newAPIHadoopFile需要路径而不是输入流,我建议--files使用spark-submit.

--files FILES逗号分隔的文件列表,放置在每个执行器的工作目录中。这些文件在执行器中的文件路径可以通过 SparkFiles.get(fileName) 访问。

请参阅SparkFiles.get方法:

获取通过添加的文件的绝对路径SparkContext.addFile()

有了这个,你应该使用spark-submit如下:

spark-submit --files fileNameHere /Users/anon/Documents/myUber.jar

在一般情况下,如果文件在 jar 文件中,您应该使用InputStream来访问该文件(而不是File直接作为)。

代码如下所示:

val content = scala.io.Source.fromInputStream(
  classOf[yourObject].getClassLoader.getResourceAsStream(yourFileNameHere)

请参阅 Scala 的Source对象和 Java 的ClassLoader.getResourceAsStream方法。

于 2017-05-16T14:41:50.863 回答