首页 > 解决方案 > 在 PySpark 中访问 scala 函数

问题描述

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

互操作性如何仍然可能?

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

标签: scalaapache-sparkpysparkpy4jlanguage-interoperability

解决方案


一般来说,你不会。虽然有时可以在这种情况下进行访问,但使用__getattribute__/ getattr,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 友好的(不需要任何疯狂的 hack、广泛的类型转换或填充通常由 Scala 编译器处理的空白),那么它也应该非常适合 PySpark。


推荐阅读