如何在PySpark中使用Scala UDF?

7
我希望能够在PySpark中使用Scala函数作为UDF。
package com.test

object ScalaPySparkUDFs extends Serializable {
    def testFunction1(x: Int): Int = { x * 2 }
    def testUDFFunction1 = udf { x: Int => testFunction1(x) }
} 

我可以在PySpark中访问testFunction1并返回值:
functions = sc._jvm.com.test.ScalaPySparkUDFs 
functions.testFunction1(10)

我希望你能将这个函数作为UDF使用,最好在withColumn调用中使用:
row = Row("Value")
numbers = sc.parallelize([1,2,3,4]).map(row).toDF()
numbers.withColumn("Result", testUDFFunction1(numbers['Value']))

我认为一种有前途的方法是在此处找到: Spark: How to map Python with Scala or Java User Defined Functions? 但是,当对那里找到的代码进行更改以使用 testUDFFunction1 时:
def udf_test(col):
    sc = SparkContext._active_spark_context
    _f = sc._jvm.com.test.ScalaPySparkUDFs.testUDFFunction1.apply
    return Column(_f(_to_seq(sc, [col], _to_java_column)))

I get:

 AttributeError: 'JavaMember' object has no attribute 'apply' 

我不理解这个,因为我相信testUDFFunction1确实有一个apply方法?
我不想使用这里发现的类型的表达式:从Scala向SqlContext注册UDF以在PySpark中使用 如果您有任何建议如何使其工作,将不胜感激!
2个回答

8

同意@user6910411的意见,你必须直接在函数上调用apply方法。

Scala中的UDF:

import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.functions._


object ScalaPySparkUDFs {

    def testFunction1(x: Int): Int = { x * 2 }

    def getFun(): UserDefinedFunction = udf(testFunction1 _ )
}

PySpark 代码:

def test_udf(col):
    sc = spark.sparkContext
    _test_udf = sc._jvm.com.test.ScalaPySparkUDFs.getFun()
    return Column(_test_udf.apply(_to_seq(sc, [col], _to_java_column)))


row = Row("Value")
numbers = sc.parallelize([1,2,3,4]).map(row).toDF()
numbers.withColumn("Result", test_udf(numbers['Value']))

我想传递多列数据,有没有办法可以实现? - lifeisshubh
当我运行这个程序时,出现了TypeError: 'JavaPackage' object is not callable的错误。 - subhayang

6

您链接的问题使用了Scala的object。Scala的object是单例模式,您可以直接使用apply方法。

这里使用了一个无参函数,它返回一个UserDefinedFunction类的对象,所以您需要先调用该函数:

_f = sc._jvm.com.test.ScalaPySparkUDFs.testUDFFunction1() # Note () at the end
Column(_f.apply(_to_seq(sc, [col], _to_java_column)))

如果我想传递多列,是否有类似的东西? - lifeisshubh
@zero323,你能否指导我解决这个问题:https://dev59.com/Ntb8oIgBc1ULPQZFIQdU?非常感谢。 - M_Gh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接