是否可以从 Scala(spark) 调用 python 函数

Posted

技术标签:

【中文标题】是否可以从 Scala(spark) 调用 python 函数【英文标题】:Is it possible to call a python function from Scala(spark) 【发布时间】:2017-09-15 16:54:30 【问题描述】:

我正在创建一个 Spark 作业,该作业需要使用 Python 编写的函数将一列添加到数据框中。其余的处理是使用 Scala 完成的。

我找到了如何从 pyspark 调用 Java/Scala 函数的示例:

https://community.hortonworks.com/questions/110844/is-it-possible-to-call-a-scala-function-in-pythonp.html http://aseigneurin.github.io/2016/09/01/spark-calling-scala-code-from-pyspark.html

我发现以另一种方式发送数据的唯一示例是使用pipe

How to Use both Scala and Python in a same Spark project?

我是否可以将整个数据帧发送到 python 函数,让函数处理数据并添加额外的列,然后将生成的数据帧发送回调用 Scala 函数?

如果这不可能,我当前的解决方案是运行 pyspark 进程并调用多个 Scala 函数来操作数据帧,这并不理想。

【问题讨论】:

虽然理论上可行(通过 Py4j 回调),但不值得这么忙。 Spark 旨在让客人的互动变得轻松,而不是相反。如果你想让事情变得更简单——只需将整个 Scala 管道整合到一个包装函数中。或者使用 Databricks 或 Zeppelin 之类的笔记本。但是对于单个函数来说,重写它几乎总是更好。 不幸的是,重写函数的工作量很大。它利用了一些没有基于 jvm 的等效库。我也已经将管道包装在一个函数中。我希望我错过了什么。 ☹ 看起来我被困在使用 python 作为我的入口点 另一种方法是使用腌制对象并从 Java 手动创建 PythonFunctionUserDefinedPythonFunction,但我建议不要这样做。 @roblovelock:你找到解决方案了吗?我们需要类似的东西吗? 不,很遗憾,我没有。上周我遇到了一个类似的问题,因此决定用 python 编写解决方案。稍后我会看看我是否可以一劳永逸地解决这个问题。 【参考方案1】:

只需从 Python 注册一个 UDF,然后从 Scala 评估一个使用该函数针对 DataFrame 的 SQL 语句 - 就像一个魅力,刚刚尝试过;) https://github.com/jupyter/docker-stacks/tree/master/all-spark-notebook 是在 Toree 中运行笔记本的好方法,它混合了调用相同 Spark 上下文的 Scala 和 Python 代码。

【讨论】:

您好,Egor,您要发布示例以供参考吗? 显然,他没有:)【参考方案2】:

我找到了这篇文章:

Machine Learning with Jupyter using Scala, Spark and Python: The Setup

它向您展示了如何设置一个同时使用 Spark 和 Python 的 Jupyter 笔记本。如果您只是在试验数据,那可能就足够了。

【讨论】:

以上是关于是否可以从 Scala(spark) 调用 python 函数的主要内容,如果未能解决你的问题,请参考以下文章

spark-submit 执行scala代码

scala用户定义函数在spark sql中不起作用

使用 Scala 从 Spark 的 withColumn 中调用 udf 时出错

如何使用反射从scala调用spark UDF?

Scala Spark - 调用 createDataFrame 时获取重载方法

PySpark 是不是调用 java api,然后 java api 在 Apache Spark 中调用 scala api?