我有一个Scala库,其中包含Scala Spark API的一些实用程序代码和UDF。然而,我现在很想开始将这个Scala库与PySpark一起使用。使用基于Java的类似乎可以像在PySpark中运行自定义Java类一样正常工作,但是,当我使用用Scala编写的库时,有些类的名称可能不是直接的,并且包含$
等字符。
互操作性是如何实现的?
我如何使用Java/Scala代码,因为它提供了一个需要泛型类型参数的函数?
一般情况下,您不会。虽然在这种情况下,使用__getattribute__
/getattr
有时可以访问Py4j,但Py4j在设计时根本没有考虑到Scala(这实际上并不是Python特有的——虽然Scala在技术上可以用Java进行插值,但它是一种更丰富的语言,而且它的许多功能不容易从其他JVM语言中访问)。
在实践中,你应该做Spark内部做的同样的事情——不要直接公开Scala API,而是创建一个精简的*Java或Scala API,它是专门为与客语言的互操作性而设计的。由于Py4j只提供基本Python和Java类型之间的转换,并且不处理常用的Scala接口,所以无论如何都需要这样的中间层,除非Scala库是专门为Java互操作性设计的。
截至您上次关注
如何使用Java/Scala代码来提供需要泛型类型参数的函数?
Py4j可以很好地处理Java泛型,而无需任何特殊处理。高级Scala特性(清单、类标签、类型标签)通常是不可行的,但同样,在设计时(尽管这是可能的)没有考虑到Java互操作性。
*根据经验,如果某个东西是Java友好的(不需要任何疯狂的黑客攻击、广泛的类型转换或填补Scala编译器通常处理的空白),那么它也应该非常适合PySpark。