Scala
でPyspark
クラスを使用する方法があるかどうか、しばらく探していましたが、この主題に関するドキュメントもガイドも見つかりませんでした。
Apache-spark
のライブラリを使用するScala
に単純なクラスを作成するとします。
class SimpleClass(sqlContext: SQLContext, df: DataFrame, column: String) {
def exe(): DataFrame = {
import sqlContext.implicits._
df.select(col(column))
}
}
Pyspark
で使用する方法はありますか?.py
ファイルを作成する必要がありますか?ちなみにspark
のコードも見て、少し迷ってしまい、自分の目的に合わせて機能を複製することができませんでした。
はい、それは簡単なことではありませんが可能です。通常、Java(Friendly)ラッパーが必要なため、Scala機能を処理する必要がないため、単純なJavaとその結果、Py4Jゲートウェイではうまく機能しません。
クラスがパッケージcom.example
で、Python DataFrame
がdf
と呼ばれる
df = ... # Python DataFrame
あなたはする必要があります:
お気に入りのビルドツール を使用してjarをビルドします。
たとえば、PySparkシェルの--driver-class-path
引数/ spark-submit
を使用して、それをドライバークラスパスに含めます。正確なコードによっては、--jars
を使用して渡す必要がある場合もあります。
Python SparkContext
インスタンスからJVMインスタンスを抽出します。
jvm = sc._jvm
抽出Scala SQLContext
SQLContext
インスタンスから:
ssqlContext = sqlContext._ssql_ctx
抽出Java DataFrame
からdf
:
jdf = df._jdf
SimpleClass
の新しいインスタンスを作成:
simpleObject = jvm.com.example.SimpleClass(ssqlContext, jdf, "v")
Call exe
メソッドを呼び出し、Python DataFrame
を使用して結果をラップします。
from pyspark.sql import DataFrame
DataFrame(simpleObject.exe(), ssqlContext)
結果は有効なPySpark DataFrame
になります。もちろん、すべてのステップを1つの呼び出しに組み合わせることができます。
重要:このアプローチは、Pythonコードがドライバでのみ実行される場合にのみ可能です。これは、内部では使用できません= Pythonアクションまたは変換。詳細は アクションまたは変換からJava/Scala関数を使用する方法? を参照してください。