2015-08-26 2 views
0

У меня есть java проект, содержащий класс MyFileLoader (среди прочих), которые успешно загружает файл ресурсов с помощью:не может загрузить Java Resources в Спарк от Scala

public static List<String> loadFile() { 
    Path path = System.class.getResource("/my/path/model.bin").getFile().toPath(); 
    return Files.readAllLines(path, UTF_8); 
} 

, а затем делает некоторую обработку.

После добавления этого проекта/банки в качестве зависимости в scala, я попытался получить доступ к MyFileLoader.loadFile. К сожалению, это дает java.lang.NullPointerException, так как ресурс не найден.

Для отладки, я запустил эту команду в spark-shell, показывая, что этот ресурс действительно существует:

scala> getClass.getResource("/my/path/model.bin").getFile 
res32: String = file:/some-local-path/my-jar-with-dependencies.jar!/my/path/model.bin 

Затем я попробовал:

scala> Files.readAllLines(new File(getClass.getResource("/my/path/model.bin").getPath).toPath) 
java.nio.file.NoSuchFileException: file:/some-local-path/my-jar-with-dependencies.jar!/my/path/model.bin 
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) 
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) 
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) 
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) 
at java.nio.file.Files.newByteChannel(Files.java:361) 
at java.nio.file.Files.newByteChannel(Files.java:407) 
at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384) 
at java.nio.file.Files.newInputStream(Files.java:152) 
at java.nio.file.Files.newBufferedReader(Files.java:2784) 
at java.nio.file.Files.readAllLines(Files.java:3202) 
at java.nio.file.Files.readAllLines(Files.java:3242) 
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:20) 
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:25) 
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:27) 
at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:29) 
at $iwC$$iwC$$iwC$$iwC.<init>(<console>:31) 
at $iwC$$iwC$$iwC.<init>(<console>:33) 
at $iwC$$iwC.<init>(<console>:35) 
at $iwC.<init>(<console>:37) 
at <init>(<console>:39) 
at .<init>(<console>:43) 
at .<clinit>(<console>) 
at .<init>(<console>:7) 
at .<clinit>(<console>) 
at $print(<console>) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065) 
at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1338) 
at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840) 
at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871) 
at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819) 
at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:856) 
at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:901) 
at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:813) 
at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:656) 
at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:664) 
at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$loop(SparkILoop.scala:669) 
at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:996) 
at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:944) 
at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:944) 
at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135) 
at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:944) 
at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1058) 
at org.apache.spark.repl.Main$.main(Main.scala:31) 
at org.apache.spark.repl.Main.main(Main.scala) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:569) 
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166) 
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189) 
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110) 
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 

Почему я не в состоянии загрузить ресурс эти пути?

ответ

3

Поскольку ваш файл теперь упакован внутри банки, вам нужно будет использовать Class.getResourceAsStream(). Кажется, вы пытаетесь прочитать URL как обычный файл, который не поддерживается (он, скорее всего, работал до того, как он не был упакован внутри банки и был загружен как обычный файл).

Смежные вопросы