在 PySpark 中访问 scala 函数

Access scala function in PySpark

我有一个 Scala 库,其中包含一些用于 Scala Spark API 的实用程序代码和 UDF。 但是,我很乐意现在开始将这个 Scala 库与 PySpark 一起使用。使用基于 Java 的 类 似乎工作得很好,就像概述的 Running custom Java class in PySpark,但是当我使用一个用 Scala 编写的库时,一些 类 的名称可能不是直截了当的并且包含像 $.

这样的字符

如何实现互操作性?

如何使用 Java/Scala 提供需要通用类型参数的函数的代码?

通常你不会。虽然在这种情况下访问有时是可能的,但使用 __getattribute__ / getattr,Py4j 在设计时根本就没有考虑到 Scala(这实际上不是 Python 特定的——而 Scala 在技术上可以与 Java,它是一种更丰富的语言,它的许多特性是其他 JVM 语言不容易获得的。

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

关于您最后的关注

How can I use Java/Scala code which is offering a function requiring a generic type parameter?

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


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