我一直在寻找是否有某种方法可以使用中的Scala类Pyspark,但我还没有找到任何文档或有关此主题的指南。
Scala
Pyspark
假设我创建了一个简单的类,Scala其中使用的一些库apache-spark,例如:
apache-spark
class SimpleClass(sqlContext: SQLContext, df: DataFrame, column: String) { def exe(): DataFrame = { import sqlContext.implicits._ df.select(col(column)) } }
.py
顺便说一句,我也看了一下spark代码,感到有点迷茫,我无法出于自己的目的复制它们的功能。
spark
是的,尽管不是很琐碎,但它是可能的。通常,您需要一个Java(友好的)包装器,这样就不必处理Scala功能,而这些功能使用普通Java不能轻松表达,因此在Py4J网关中无法很好地发挥作用。
假设您的课程是int包com.example,并DataFrame调用了Pythondf
com.example
DataFrame
df
df = ... # Python DataFrame
您必须:
使用您最喜欢的构建工具来构建jar 。
将其包括在驱动程序类路径中,例如使用--driver-class-pathPySpark shell /的参数spark-submit。根据确切的代码可能无法使用通过它--jars以及
--driver-class-path
spark-submit
--jars
从PythonSparkContext实例中提取JVM实例:
SparkContext
jvm = sc._jvm
SQLContext从SQLContext实例中提取Scala :
SQLContext
ssqlContext = sqlContext._ssql_ctx
DataFrame从中提取Java df:
jdf = df._jdf
创建的新实例SimpleClass:
SimpleClass
simpleObject = jvm.com.example.SimpleClass(ssqlContext, jdf, "v")
调用exe方法并使用Python包装结果DataFrame:
exe
from pyspark.sql import DataFrame
DataFrame(simpleObject.exe(), ssqlContext)
结果应该是有效的PySpark DataFrame。您当然可以将所有步骤组合到一个调用中。
重要提示 :仅当仅在驱动程序上执行Python代码时,此方法才可行。不能在Python操作或转换中使用。