web-dev-qa-db-ja.com

Pyspark内でScalaクラスを使用する方法

ScalaPysparkクラスを使用する方法があるかどうか、しばらく探していましたが、この主題に関するドキュメントもガイドも見つかりませんでした。

Apache-sparkのライブラリを使用するScalaに単純なクラスを作成するとします。

class SimpleClass(sqlContext: SQLContext, df: DataFrame, column: String) {
  def exe(): DataFrame = {
    import sqlContext.implicits._

    df.select(col(column))
  }
}
  • このクラスをPysparkで使用する方法はありますか?
  • 難しいですか?
  • .pyファイルを作成する必要がありますか?
  • それを行う方法を示すガイドはありますか?

ちなみにsparkのコードも見て、少し迷ってしまい、自分の目的に合わせて機能を複製することができませんでした。

19

はい、それは簡単なことではありませんが可能です。通常、Java(Friendly)ラッパーが必要なため、Scala機能を処理する必要がないため、単純なJavaとその結果、Py4Jゲートウェイではうまく機能しません。

クラスがパッケージcom.exampleで、Python DataFramedfと呼ばれる

df = ... # Python DataFrame

あなたはする必要があります:

  1. お気に入りのビルドツール を使用してjarをビルドします。

  2. たとえば、PySparkシェルの--driver-class-path引数/ spark-submitを使用して、それをドライバークラスパスに含めます。正確なコードによっては、--jarsを使用して渡す必要がある場合もあります。

  3. Python SparkContextインスタンスからJVMインスタンスを抽出します。

    jvm = sc._jvm
    
  4. 抽出Scala SQLContextSQLContextインスタンスから:

    ssqlContext = sqlContext._ssql_ctx
    
  5. 抽出Java DataFrameからdf

    jdf = df._jdf
    
  6. SimpleClassの新しいインスタンスを作成:

    simpleObject = jvm.com.example.SimpleClass(ssqlContext, jdf, "v")
    
  7. Call exeメソッドを呼び出し、Python DataFrameを使用して結果をラップします。

    from pyspark.sql import DataFrame
    
    DataFrame(simpleObject.exe(), ssqlContext)
    

結果は有効なPySpark DataFrameになります。もちろん、すべてのステップを1つの呼び出しに組み合わせることができます。

重要:このアプローチは、Pythonコードがドライバでのみ実行される場合にのみ可能です。これは、内部では使用できません= Pythonアクションまたは変換。詳細は アクションまたは変換からJava/Scala関数を使用する方法? を参照してください。

25
zero323