Я хочу, чтобы иметь возможность использовать функцию Scala как UDF в PySparkИспользование Scala UDF в PySpark
package com.test
object ScalaPySparkUDFs extends Serializable {
def testFunction1(x: Int): Int = { x * 2 }
def testUDFFunction1 = udf { x: Int => testFunction1(x) }
}
я могу получить доступ testFunction1
в PySpark и он возвращает значения:
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'
I не понимаю этого, потому что я считаю, что testUDFFunction1
имеет метод применения?
Я не хочу использовать выражения типа найденных здесь: Register UDF to SqlContext from Scala to use in PySpark
Любые предложения о том, как сделать эту работу будет оценен по достоинству!