【问题标题】:Access scala function in PySpark在 PySpark 中访问 scala 函数
【发布时间】:2019-06-09 09:12:51
【问题描述】:

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

互操作性如何仍然可能?

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

【问题讨论】:

标签: scala apache-spark pyspark py4j language-interoperability


【解决方案1】:

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

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

上次关注

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

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


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

【讨论】:

  • 你知道一个很好的例子来开始提供这样一个精简的java API吗?
  • Spark 源是最好的起点。此外,您可能会在 SO 上找到一些示例,例如遵循来自 Calling Java/Scala function from a task 的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2020-09-18
  • 2016-11-17
  • 2016-05-01
  • 2019-10-02
相关资源
最近更新 更多