在PySpark中访问scala函数

在PySpark中访问scala函数,scala,apache-spark,pyspark,py4j,language-interoperability,Scala,Apache Spark,Pyspark,Py4j,Language Interoperability,我有一个Scala库,其中包含Scala Spark API的一些实用程序代码和UDF。 然而,我希望现在开始将这个Scala库与PySpark一起使用。使用基于Java的类似乎可以很好地工作,正如所概述的那样,但是当我使用Scala编写的库时,一些类的名称可能不直接,并且包含像$这样的字符 互操作性如何仍然可行 如何使用Java/Scala代码,它提供了一个需要泛型类型参数的函数 一般来说,你不会。虽然在这种情况下访问有时是可能的,但使用\uuu getattribute\uuu/getatt

我有一个Scala库,其中包含Scala Spark API的一些实用程序代码和UDF。 然而,我希望现在开始将这个Scala库与PySpark一起使用。使用基于Java的类似乎可以很好地工作,正如所概述的那样,但是当我使用Scala编写的库时,一些类的名称可能不直接,并且包含像
$
这样的字符

互操作性如何仍然可行


如何使用Java/Scala代码,它提供了一个需要泛型类型参数的函数

一般来说,你不会。虽然在这种情况下访问有时是可能的,但使用
\uuu getattribute\uuu
/
getattr
,Py4j的设计并没有考虑Scala(这实际上并不特定于Python——虽然从技术上讲Scala可以使用Java进行插值,但它是一种更丰富的语言,并且它的许多特性不容易从其他JVM语言访问)

实际上,您应该做Spark内部所做的事情,而不是直接公开Scala API,而是创建一个lean*Java或Scala API,专门为与来宾语言的互操作性而设计。由于Py4j只提供基本Python和Java类型之间的转换,并且不处理常用的Scala接口,无论如何,您都需要这样的中间层,除非Scala库是专门为Java互操作性设计的

作为你最后的顾虑

如何使用Java/Scala代码,它提供了一个需要泛型类型参数的函数

Py4j可以很好地处理Java泛型,而无需任何特殊处理。高级Scala功能(清单、类标记、类型标记)通常是不可行的,但再一次,在设计时没有考虑Java互操作性(尽管可能)



*根据经验,如果某些东西是Java友好的(不需要任何疯狂的破解、广泛的类型转换或填充Scala编译器通常处理的空白),它也应该很适合PySpark。

一般来说,您不需要。虽然在这种情况下访问有时是可能的,但使用
\uuuu getattribute\uuuu
/
getattr
,Py4j的设计并没有考虑Scala(这实际上并不特定于Python——虽然从技术上讲Scala可以使用Java进行插值,但它是一种更丰富的语言,并且它的许多特性不容易从其他JVM语言访问)

实际上,您应该做Spark内部所做的事情,而不是直接公开Scala API,而是创建一个lean*Java或Scala API,专门为与来宾语言的互操作性而设计。由于Py4j只提供基本Python和Java类型之间的转换,并且不处理常用的Scala接口,无论如何,您都需要这样的中间层,除非Scala库是专门为Java互操作性设计的

作为你最后的顾虑

如何使用Java/Scala代码,它提供了一个需要泛型类型参数的函数

Py4j可以很好地处理Java泛型,而无需任何特殊处理。高级Scala功能(清单、类标记、类型标记)通常是不可行的,但再一次,在设计时没有考虑Java互操作性(尽管可能)



*根据经验,如果某些东西是Java友好的(不需要任何疯狂的破解、广泛的类型转换或填充Scala编译器通常处理的空白),它也应该很适合PySpark。

看起来很有趣,但到目前为止我还没有让它工作。看起来很有趣,但到目前为止我还没有让它工作。你知道一个好的例子来开始提供这样一个精简的java API吗?Spark源代码是最好的开始。此外,你可能会找到一些这样的例子,例如下面的你知道一个好的例子来开始提供这样一个精简的java API吗?Spark源代码是最好的开始。此外,你可能会发现一些这样的例子,例如下面的链接