2017-05-25 5 views
1

Ich habe ein Schema wie unten, die eine Ausgabe von collect_list eines groupbyFunke kann keine Funktion Form nennen .Withcolumn

root 
| 
|-- usedServiceUnits: array (nullable = true) 
| |-- element: string (containsNull = true) 
|-- accumulators: array (nullable = true) 
| |-- element: string (containsNull = true) 

Werte in dies sieht aus wie unten

+----------------+ 
|usedServiceUnits| 
+----------------+ 
|[180, 180, 1] |==> this is an array of String 
|[180, 180, 1] | 
+----------------+ 

I muss über dieses Feld einen def anrufen wie

abc.select("serviceId", "recordId", "usedServiceUnits") 
.withColumn("usedServiceUnits1",lit(sumAllValuesinString($"usedServiceUnits")) 

def sumAllValuesinString(inString: String): String= { 
var sum = 0 
val DELIM =',' 
val a = splitString(inString,DELIM) 
for (x <- a){ 
    sum += Integer.parseInt(x) 
} 
sum.toString() 

}

Wie kann ich diese Funktion aufrufen und Summe als Rückgabe erhalten und auf meine neue Spalte - usedServiceUnits1 gesetzt. Ich benötige eine ähnliche Art von Berechnung für einige Felder, in denen die Funktionen unterschiedlich sind. Also im Grunde bin ich auf der Suche nach, wie ich dies an meine Funktionen weitergeben kann oder wo ich mich ändern soll?

Vielen Dank im Voraus für die Vorschläge.

Antwort

1

Dies funktioniert für Array von String, eine UDF wie pro Ihre Frage

val getSumOf = udf((value : Seq[String]) => value.map(_.toInt).sum.toString) 
abc.withColumn("usedServiceUnits1",udf(getSumOf($"usedServiceUnits")) 

Hoffnung mit diesem für Sie wirksam sein.

0

Wie ich Ihre Anforderung verstehen, würde ich vorschlagen, dass Sie udf Funktion

definieren udf Funktion als

def sumAllValuesinString = udf((inString: mutable.WrappedArray[String]) => { 
    var sum = 0 
    val DELIM =',' 
    for (x <- inString){ 
    sum += Integer.parseInt(x) 
    } 
    sum.toString() 
}) 

verwenden und dann rufen Sie die udf Funktion withColumn als

abc.withColumn("usedServiceUnits1", sumAllValuesinString($"usedServiceUnits")) 

I hoffe das ist was du brauchst

+0

Danke Ramesh, das funktioniert für mich. –

Verwandte Themen