-1

Ich bin ein wenig verloren, wie dies zu tun ist. Ich implementiere die Summenfunktion MADlib. Diese Funktion nimmt eine beliebige Anzahl von Arrays und fügt hinzu:Summe MADlib UDF Spark SQL

sum (array [ 1,2] , array [2,3 ] , array [4,5 ]) 
Return : [7,10] 

ich von der nächsten Anweisung eine Funktion erstellen möchten, um das gleiche Ergebnis zurück, aber nicht, wie so etwas zu implementieren:

def sum[T](args: WrappedArray[T]*)(implicit n: Numeric[T]) = { 
    var i : Int = 0; 
    for(arg <- args){ 
     // Code 
     i = i + 1; 
    } 
    } 

sqlContext.udf.register("sum", sum(_:WrappedArray[Int]*)) 
sqlContext.sql("SELECT sum(collect_list(a),collect_list(b),collect_list(c)) from df").show 
+0

Ist diese Frage gelöst? – slouc

Antwort

1
def sum[T](args: WrappedArray[T]*)(implicit n: Numeric[T]) = { 
    args.transpose.map(_.sum) 
} 

sum(Array(1, 2), Array(2, 3), Array(4, 5)) // ArrayBuffer(7, 10) 
+0

Aber als Datensatz in Spark SQL-Funktion für mehrere Argumente? Weil die Anweisung fehlschlägt mir 'sqlContext.udf.register (" Summe ", Summe (_: WrappedArray [Int] *))' – nest

+0

Ich verstehe nicht, sorry. Ich dachte, du brauchst nur den Code-Teil, um die von dir beschriebene Logik zu erreichen. Die angegebene Funktion nimmt eine beliebige Anzahl von 'WrappedArray [T]' - Argumenten und addiert sie wie beschrieben (beachten Sie, dass sie gleich lang sein müssen). – slouc

+0

Sorry wenn ich es nicht gut erklärt habe. Seine Funktion dient mir, aber wie ich es in SparkSQL nicht registrieren kann, um von sql – nest