Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Pyspark中使用Scala类_Python_Scala_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 如何在Pyspark中使用Scala类

Python 如何在Pyspark中使用Scala类,python,scala,apache-spark,pyspark,apache-spark-sql,Python,Scala,Apache Spark,Pyspark,Apache Spark Sql,我已经在Pyspark中搜索了一段时间,是否有任何方法可以使用Scala类,但我没有找到任何关于这个主题的文档或指南 假设我在Scala中创建了一个简单的类,它使用了apachespark的一些库,类似于: class SimpleClass(sqlContext: SQLContext, df: DataFrame, column: String) { def exe(): DataFrame = { import sqlContext.implicits._ df.se

我已经在
Pyspark
中搜索了一段时间,是否有任何方法可以使用
Scala
类,但我没有找到任何关于这个主题的文档或指南

假设我在
Scala
中创建了一个简单的类,它使用了
apachespark
的一些库,类似于:

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

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

顺便说一句,我也看了spark的代码,我觉得有点不知所措,我无法为我自己的目的复制它们的功能。

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

假设您的类是int,那么包
com.example
将调用Python
DataFrame
df

df = ... # Python DataFrame
你必须:

  • 使用创建一个jar

  • 例如,使用PySpark shell的
    --driver class path
    参数/
    spark submit
    将其包含在驱动程序类路径中。根据具体的代码,您可能还必须使用
    --jars
    传递它

  • 从Python
    SparkContext
    实例中提取JVM实例:

    jvm = sc._jvm
    
    ssqlContext = sqlContext._ssql_ctx
    
  • SQLContext
    实例中提取Scala
    SQLContext

    jvm = sc._jvm
    
    ssqlContext = sqlContext._ssql_ctx
    
  • df
    中提取Java
    DataFrame

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

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

    from pyspark.sql import DataFrame
    
    DataFrame(simpleObject.exe(), ssqlContext)
    
  • 结果应该是有效的PySpark
    数据帧
    。当然,您可以将所有步骤合并到一个调用中


    重要:仅当Python代码仅在驱动程序上执行时,此方法才可行。它不能在Python操作或转换中使用。有关详细信息,请参阅。

    如果scala类也有其他构造函数,会发生什么?它应该有用吗?