2017-01-21 3 views
3

Я хочу, чтобы иметь возможность использовать функцию 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

Любые предложения о том, как сделать эту работу будет оценен по достоинству!

ответ

2

Вопрос, который вы связали, использует 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))) 
Смежные вопросы