4

Python からカスタム Java クラスを呼び出せるように、次の MyPythonGateway.java を作成しました。

public class MyPythonGateway {

    public String findMyNum(String input) {
        return MyUtiltity.parse(input).getMyNum(); 
    }

    public static void main(String[] args) {
        GatewayServer server = new GatewayServer(new MyPythonGateway());
        server.start();
    }
}

これが私のPythonコードでの使用方法です。

def main():

    gateway = JavaGateway()                   # connect to the JVM
    myObj = gateway.entry_point.findMyNum("1234 GOOD DAY")
    print(myObj)


if __name__ == '__main__':
    main()

MyPythonGateway.findMyNum()ここで、スタンドアロンの Python スクリプトだけでなく、PySpark の関数を使用したいと考えています。私は次のことをしました:

myNum = sparkcontext._jvm.myPackage.MyPythonGateway.findMyNum("1234 GOOD DAY")
print(myNum)

ただし、次のエラーが発生しました。

... line 43, in main:
myNum = sparkcontext._jvm.myPackage.MyPythonGateway.findMyNum("1234 GOOD DAY")
  File "/home/edamameQ/spark-1.5.2/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 726, in __getattr__
py4j.protocol.Py4JError: Trying to call a package.

それで、私はここで何を逃したのですか?pyspark を使用する場合、ゲートウェイ サーバーを起動するために MyPythonGateway の別の JavaApplication を実行する必要があるかどうかはわかりません。ご意見をお聞かせください。ありがとう!


以下はまさに私が必要とするものです:

input.map(f)

def f(row):
   // call MyUtility.java 
   // x = MyUtility.parse(row).getMyNum()
   // return x

これにアプローチする最良の方法は何ですか?ありがとう!

4

4 に答える 4

3

まず、通常、表示されるエラーは、使用しようとしているクラスにアクセスできないことを意味します。CLASSPATHしたがって、問題である可能性が最も高いです。

一般的な考え方に関しては、2 つの重要な問題があります。

  • アクションまたは変換内にアクセスできないSparkContextため、PySpark ゲートウェイを使用しても機能しません (詳細については、アクションまたは変換から Java/Scala 関数を使用する方法を参照してください)。ワーカーから Py4J を使用する場合は、各ワーカー マシンで個別のゲートウェイを起動する必要があります。
  • この方法で Python と JVM の間でデータを渡したくありません。Py4J は、データ集約型のタスク用に設計されていません。
于 2016-02-28T21:47:11.160 に答える