2017-01-21 3 views
3

Verwendung von I in PySpark eine Scala Funktion als UDF verwenden können, wolleneine Scala UDF in PySpark

package com.test 

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

I testFunction1 in PySpark zugreifen können und haben es Werte zurückgeben:

functions = sc._jvm.com.test.ScalaPySparkUDFs 
functions.testFunction1(10) 

Was ich tun möchte in der Lage sein, diese Funktion als UDF verwenden, idealerweise in einem withColumn Aufruf:

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

glaube ich, ein vielversprechender Ansatz hier zu finden ist: Spark: How to map Python with Scala or Java User Defined Functions?

Wenn jedoch die Änderungen an Code macht es gefunden testUDFFunction1 stattdessen zu verwenden:

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))) 

ich:

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

I verstehe das nicht, weil ich glaube, testUDFFunction1 hat eine Methode anwenden?

Ich will nicht hier Ausdrücke des Typs verwenden: Register UDF to SqlContext from Scala to use in PySpark

Irgendwelche Vorschläge, wie diese Arbeit würde geschätzt zu machen!

Antwort

2

Die Frage, die Sie verknüpft haben, verwendet eine Scala object. Scala object ist ein Singleton und Sie können apply Methode direkt verwenden.

Hier verwenden Sie eine nullary Funktion, die ein Objekt der Klasse UserDefinedFunction Co kehrt die Funktion zunächst aufrufen müssen:

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