小编典典

如何在Pyspark内部使用Scala类

python

我一直在寻找是否有某种方法可以使用中的ScalaPyspark,但我还没有找到任何文档或有关此主题的指南。

假设我创建了一个简单的类,Scala其中使用的一些库apache-spark,例如:

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

    df.select(col(column))
  }
}
  • 有没有可能在此类中使用此类Pyspark
  • 太难了吗?
  • 我必须创建一个.py文件吗?
  • 有没有指导说明如何做到这一点?

顺便说一句,我也看了一下spark代码,感到有点迷茫,我无法出于自己的目的复制它们的功能。


阅读 235

收藏
2020-12-20

共1个答案

小编典典

是的,尽管不是很琐碎,但它是可能的。通常,您需要一个Java(友好的)包装器,这样就不必处理Scala功能,而这些功能使用普通Java不能轻松表达,因此在Py4J网关中无法很好地发挥作用。

假设您的课程是int包com.example,并DataFrame调用了Pythondf

df = ... # Python DataFrame

您必须:

  1. 使用您最喜欢的构建工具来构建jar 。

  2. 将其包括在驱动程序类路径中,例如使用--driver-class-pathPySpark shell /的参数spark-submit。根据确切的代码可能无法使用通过它--jars以及

  3. 从PythonSparkContext实例中提取JVM实例:

    jvm = sc._jvm
    
  4. SQLContextSQLContext实例中提取Scala :

    ssqlContext = sqlContext._ssql_ctx
    
  5. DataFrame从中提取Java df

    jdf = df._jdf
    
  6. 创建的新实例SimpleClass

    simpleObject = jvm.com.example.SimpleClass(ssqlContext, jdf, "v")
    
  7. 调用exe方法并使用Python包装结果DataFrame

    from pyspark.sql import DataFrame
    

    DataFrame(simpleObject.exe(), ssqlContext)

结果应该是有效的PySpark DataFrame。您当然可以将所有步骤组合到一个调用中。

重要提示 :仅当仅在驱动程序上执行Python代码时,此方法才可行。不能在Python操作或转换中使用。

2020-12-20