2017-05-16 17 views
2

入力ファイルがカスタムで区切られ、RDD [String]として変換するためにnewAPIHadoopFileに渡されます。ファイルはプロジェクトリソースディレクトリの下にあります。次のコードは、Eclipse IDEから実行するとうまく動作します。spark-submitからアプリケーションを実行しているときにjarから入力ファイルを読み込みます。

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 /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 

入力してください。

答えて

1

ファイルはパスではありません、入力ストリームを必要とするsc.newAPIHadoopFileのためであるならば、私は​​の--filesオプションを使用してお勧めします。

各エグゼキュータの作業ディレクトリに配置するファイルのFILESカンマ区切りリストを--files。エグゼキュータのこれらのファイルのファイルパスは、SparkFiles.get(fileName)を介してアクセスできます。

SparkContext.addFile()を通じて追加したファイルの絶対パスを取得します。

SparkFiles.get方法を参照してください。それと

次のように、あなたは​​を使用する必要があります。

一般的なケースでは
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方法を参照してください。

+0

私はこれを試しましたが、sc.newAPIHadoopFileにはパスが必要であり、入力ストリームではありません – user1384205

+0

答えが更新されました...どのように機能するか教えてください。 –

関連する問題