2016-04-08 20 views
5

Javaのファイルで使用したいRecordService APIのScala Implicitクラスがあります。JavaでScala暗黙のクラスを使用する方法

package object spark { 

    implicit class RecordServiceContext(ctx: SparkContext) { 
    def recordServiceTextFile(path: String) : RDD[String] = { 
     new RecordServiceRDD(ctx).setPath(path) 
      .map(v => v(0).asInstanceOf[Text].toString) 
    } 
    } 

} 

今私は、インポートの下に使用してJavaファイルでこれをインポートしようとしています。

import com.cloudera.recordservice.spark.*; 

しかし、私はsparkContextからrecordServiceTextFile( "パス")を使用することはできませんよ。

Scalaではインポートが少し異なり、動作します。

+1

:このようなものになるだろう

。 –

+0

JavaコードでのScalaコードの読み込みは、私の目にとっては簡単な操作ではありません。 javacの内部構造をある程度理解する必要があります。また、質問は明確ではありません。あなたは質問にもっとはっきりすることができますか?より多くの "完全な"質問は、より良い答え。 –

+0

@Rameshあなたは歓迎ですが、それは私ではありませんでした。 –

答えて

6

は、パッケージオブジェクト内の暗黙のクラスの単純な定義

package object spark { 
    implicit class Ext(param: Int) { 
    def a = param + 1 
    } 
} 

、ここでは、あなたはあなたが基本的にあなたを包む方法としてRecordServiceContext使用できるJava

public class Test { 
    public static void main(String[] args) { 
     spark.package$.MODULE$.Ext(123).a(); 
    } 
} 

からそれを使用する方法でありますSparkContextを呼び出し、呼び出すことができる追加のメソッドを追加します。それは暗黙のクラスの最適化です。私は暗黙のクラスが表示されない

SparkContext c = ??? 
RDD<String> rdd = com.cloudera.recordservice.spark.package$.MODULE$.RecordServiceContext(c) 
    .recordServiceTextFile("asdf"); 
+0

ありがとう、うまくいく.. – Shankar

0
SparkContext ctx = ... 
RecordServiceContext rsct = new RecordServiceContext(ctx) 
recordServiceTextFile("/your_path") 
0

これはそれを行う必要があります。

String s = new spark.RecordServiceContext("safa").recordServiceTextFile("dsf"); 

私は署名を変更しました。

マイScalaのクラスは

object spark { 
implicit class RecordServiceContext(ctx: String) { 
def recordServiceTextFile(path: String) : String = { 
"test" 
} 
} 
} 

、次のようになります私のJavaクラスは、次のようになります

public class TestScalaCall { 
public static void main(String args[]){ 
    String s = new spark.RecordServiceContext("safa").recordServiceTextFile("dsf"); 
} 
} 

編集---

ので、Scalaの変化を簡単に見ては、ショーを要求我々this

実際には、package objectで定義されたクラスを、通常のpackageの内部で定義するのと同じように動作させることに取り組んでいます。しかし、それはまだリリース2.12を対象としています。

これは、パッケージオブジェクト内で外部対話を必要としないクラス/オブジェクトを絶対に必要なものにすることを推奨しています。それ以外の場合は、通常のパッケージの下に保管してください 今のところ、package object構成を使用する必要はありません。

また、熟考に値する点は、「それは本当に意味がパッケージオブジェクトの内側、外側にアクセス可能であるものを定義するために作るのか?」

+0

あなたの暗黙のクラスは、 'object spark'の前に' package'がありません。それは私が直面している主な問題です... – Shankar

+0

私は答えに説明を追加しました。それはスカラーチームが取り組んでいることです。 –

1

package object sparkをパッケージsparkにクラスpackageにコンパイルされます。暗黙のクラスRecordServiceContextは、packageとクラスpackage$RecordServiceContextの静的メソッドRecordServiceContext(それはスカラの暗黙のdefです)にコンパイルされます。

だから、次のコードは、それを行う必要があります。

import com.cloudera.recordservice.spark.*; 

//some code 

RDD<String> rdd = package.RecordServiceContext(myContext).recordServiceTextFile(pathToFile); 

//some code 

しかしpackageはおそらく、予約済みのキーワードである、とJavaは、私の知る限りでは、それらをエスケープする方法はありません。したがって、RecordServiceContextメソッドを呼び出すためには、何らかのリフレクションを行う必要があります。ここで

関連する問題