scala - 在 PySpark 中访问 scala 函数
问题描述
我有一个 Scala 库,其中包含一些实用程序代码和 Scala Spark API 的 UDF。但是,我现在很想开始将这个 Scala 库与 PySpark 一起使用。使用基于 Java 的类似乎工作得很好,就像概述的在 PySpark 中运行自定义 Java 类一样,但是当我使用一个用 Scala 编写的库时,一些类的名称可能不是直截了当的,并且包含诸如$
.
互操作性如何仍然可能?
如何使用提供需要泛型类型参数的函数的 Java/Scala 代码?
解决方案
一般来说,你不会。虽然有时可以在这种情况下进行访问,但使用__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。
推荐阅读
- bash - windows-subsystem-for-linux上的'sudo su -'时如何保留windows $PATH
- php - 如何从 docusign API 获取文档?
- javascript - ES6 处理对象(归约函数)
- r - R read.xlsx2:java.lang.NegativeArraySizeException
- java - 在 PHP 中复制 Java 的 AES/CBC/PKCS5Padding 加密
- wildfly - MDB 和持续集成
- shell - 火花读取文件扩展名
- spring-boot - 配置spring security AntMatcher不工作spring boot 1.5.7版
- node.js - 无法在 Salesforce 中安装联系控制面板
- makefile - 使用 make 命令编译错误 std::__cxx11