在pyspark中包装java函数

在pyspark中包装java函数,java,python,apache-spark,pyspark,Java,Python,Apache Spark,Pyspark,我试图创建一个用户定义的聚合函数,我可以从python调用它。我试着跟着问题的答案走。 我基本上实现了以下内容(摘自): 我得到了以下错误: --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-24-f45b2a

我试图创建一个用户定义的聚合函数,我可以从python调用它。我试着跟着问题的答案走。 我基本上实现了以下内容(摘自):

我得到了以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-f45b2a367e67> in <module>()
----> 1 b = df.agg(myCol("A"))

<ipython-input-22-afcb8884e1db> in myCol(col)
      4 def myCol(col):
      5     _f = sc._jvm.com.blu.bla.MySum.apply
----> 6     return Column(_f(_to_seq(sc,[col], _to_java_column)))

TypeError: 'JavaPackage' object is not callable
还尝试简单地创建类(如建议的):

所有人都收到相同的错误消息


我似乎不知道问题出在哪里。

因此,主要的问题是,如果提供了相对路径,那么添加jar的所有选项(--jar、驱动程序类路径、SPARK_类路径)都无法正常工作。这可能是因为ipython中的工作目录与我运行pyspark的位置不同

一旦我将它改为绝对路径,它就可以工作了(还没有在集群上测试它,但至少在本地安装上可以工作)

另外,我不确定答案中是否也有bug,因为答案使用了scala实现,但是在java实现中我需要这样做

def myCol(col):
    _f = sc._jvm.com.blu.bla.MySum().apply
    return Column(_f(_to_seq(sc,[col], _to_java_column)))

这可能不是很有效,因为它每次都会创建_f,相反,我可能应该在函数之外定义_f(同样,这需要在集群上进行测试),但至少现在它提供了正确的功能答案

最后一件事,供将来参考,这是在spark 1.6.0 local(单节点)上测试的Installation在群集上对此进行了测试,结果正常。一起使用--jars和--driver类路径(显然--jars没有设置驱动程序的类路径)嗨!我正在尝试做一件类似的事情,但我得到了相同的错误,我无法理解它,您能否提供一些关于如何运行它的见解。让我们假设您的jar位于/home/a/a.jar。我要做的是用--jars/home/a/a.jar--driver class path/home/a/a.jar运行它,结果是fineHi-Assaf,我得到了相同的错误。我经过两个罐子(逗号分隔)。然后我试着把它们放在一个目录中,我得到了一个错误,我的支持jar(一个是使用另一个的主jar)没有主类。我该怎么做?
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-f45b2a367e67> in <module>()
----> 1 b = df.agg(myCol("A"))

<ipython-input-22-afcb8884e1db> in myCol(col)
      4 def myCol(col):
      5     _f = sc._jvm.com.blu.bla.MySum.apply
----> 6     return Column(_f(_to_seq(sc,[col], _to_java_column)))

TypeError: 'JavaPackage' object is not callable
from py4j.java_gateway import java_import
jvm = sc._gateway.jvm
java_import(jvm, "com.bla.blu.MySum")
def myCol2(col):
    _f = jvm.bla.blu.MySum.apply
    return Column(_f(_to_seq(sc,[col], _to_java_column)))
a = jvm.com.bla.blu.MySum()
def myCol(col):
    _f = sc._jvm.com.blu.bla.MySum().apply
    return Column(_f(_to_seq(sc,[col], _to_java_column)))