Apache spark 如何在Java/Scala的SparkSQL中将Python函数注册为UDF?

Apache spark 如何在Java/Scala的SparkSQL中将Python函数注册为UDF?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我在Python中有几个非常非常简单的函数,我想在Spark SQL中用作UDF。从Python注册和使用它们似乎很容易。但是当使用JavaSQLContext或SQLContext时,我想从Java/Scala中使用它们。我注意到spark 1.2.1中有函数,但我既不清楚如何使用它,也不清楚是否应该 有什么办法吗?我认为在1.3.0中可能会变得更容易,但我仅限于1.2.1 编辑: 由于不再从事这方面的工作,我很想知道如何在任何Spark版本中做到这一点。鉴于Spark UDF()的最新实现不

我在Python中有几个非常非常简单的函数,我想在Spark SQL中用作UDF。从Python注册和使用它们似乎很容易。但是当使用JavaSQLContext或SQLContext时,我想从Java/Scala中使用它们。我注意到spark 1.2.1中有函数,但我既不清楚如何使用它,也不清楚是否应该

有什么办法吗?我认为在1.3.0中可能会变得更容易,但我仅限于1.2.1

编辑:
由于不再从事这方面的工作,我很想知道如何在任何Spark版本中做到这一点。

鉴于Spark UDF()的最新实现不包括任何python UDF注册功能(仅限scala和Java),我建议

您将能够使用调用Jython的方法定义一个Java类来运行python函数,然后在SQL上下文中将这些Java方法注册为UDF。虽然这比直接将python代码注册为UDF更为迂回,但它的好处是符合当前模式并具有更易于维护的上下文切换

from pyspark.sql import *
from pyspark.sql.types import *
from pyspark.sql import SQLContext

def dummy_function(parameter_key):
    return "abc"

sqlContext.udf.register("dummy_function", dummy_function)

这就是我们如何定义函数并注册以在任何spark sql查询中使用的方法

同时请记住,如果在函数中使用任何不可序列化的功能,则代码在运行时将失败,因为udf中的每个对象都应可序列化,以便JVM在计算期间在节点之间传输它们。任何更新关于这个?Jython仍然是最好的选择吗?虽然使用Jython仍然是可能的,但兼容性仅限于Python2.7,而且它们的开发似乎在很大程度上已经停滞了(上一个重要消息来自于)。鉴于OP声明Python函数非常简单,似乎最好重构成Java并在UDFs中声明代码。是否有任何新的解决方案可用于此问题。我有一些ML python代码要在Java Spark中执行SQL@SurabhiMundra据我所知,没有新的解决方案—Jython仍然有效,但由于它现在只使用Python 2实现,因此它与Spark的最新版本不完全兼容。