python – 在PySpark中使用Scala UDF

我希望能够在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)))

我明白了:

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

我不明白这一点,因为我相信testUDFFunction1确实有一个apply方法?

我不想使用此处找到的类型的表达式:
Register UDF to SqlContext from Scala to use in PySpark

任何有关如何使这项工作的建议将不胜感激!

最佳答案
您链接的问题是使用Scala对象. Scala对象是单例,您可以直接使用apply方法.

在这里你使用一个nullary函数返回UserDefinedFunction类的对象,你必须先调用该函数:

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

转载注明原文:python – 在PySpark中使用Scala UDF - 代码日志