当前位置: 首页 > 面试题库 >

如何在Pyspark内部使用Scala类

曾成天
2023-03-14
问题内容

我一直在寻找是否有某种方法可以使用中的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代码,感到有点迷茫,我无法出于自己的目的复制它们的功能。


问题答案:

是的,尽管不是很琐碎,但它是可能的。通常,您需要一个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操作或转换中使用。



 类似资料:
  • 我有一个简单的内部类变量,如何在scala中访问它?

  • 问题内容: 我尝试了解如何使用“内部”包组织代码。让我展示一下我的结构: 在GOPATH树之外。无论我尝试从什么都不导入的任何路径都可行,唯一可行的情况是。我认为我做错了什么,或者总体上弄错了“内部”包装想法。任何人都可以让事情变得更清楚吗? 更新 上面的示例是正确的,我唯一需要的是将文件夹放在下。因此,如果我们仅从子树而不是从外部导入,则该导入路径是可行的。 问题答案: 包必须位于您的包中才能导

  • 问题内容: 我试图更深入地了解Python的工作方式,并且一直在查看http://docs.python.org/3.3/reference/grammar.html上显示的语法。 我注意到它说您也必须更改parsermodule.c,但说实话,我只是不关注这里发生的事情。 我了解语法是如何阅读该语言的规范,但是…我什至不知道该写的是什么。它看起来几乎像Python,但实际上不是。 我希望更好地了

  • 问题内容: Java中的以下代码可正确编译: 而Scala中的此代码不: Java代码清单到Scala的正确翻译(如果存在)是什么? 欢迎对语言设计进行理论解释。 问题答案: 内部类型仅针对特征的特定实例实现定义。由于scala具有 依赖于路径的 类型,因此的每个实例将具有自己的子特性。 如果您需要一个接口来实现客户端的一般行为,并且不依赖于特定实例,则应在

  • 问题内容: 我正在使用Scala 2.8中的JSON类中的构建来解析JSON代码。由于最小化依赖性,我不想使用Liftweb或其他任何一种。 我这样做的方法似乎势在必行,是否有更好的方法可以做到? 问题答案: 这是一个基于提取器的解决方案,它将进行类转换: 在for循环的开始,我人为地将结果包装在一个列表中,以便在最后生成一个列表。然后在for循环的其余部分中,我将使用生成器(使用)和值定义(使用

  • 我有一个pyspark数据帧(df1 ),它由10K行组成,数据帧看起来像- 另一个pyspark数据帧(df2)由100k记录组成,看起来像- 我想使用pyspark内连接,最终的数据帧看起来像- df2中mobile_no的长度是12,但df1中是10。我可以加入它,但这是昂贵的操作。使用pyspark有帮助吗?