2016-07-24 9 views
1

Betrachten Sie den Code untenSpark-UDF gibt eine Länge des Feldes statt Länge Wert

object SparkUDFApp {  
    def main(args: Array[String]) { 

    val df = ctx.read.json(".../example.json") 
    df.registerTempTable("example") 

    val fn = (_: String).length // % 10 
    ctx.udf.register("len10", fn) 

    val res0 = ctx sql "SELECT len10('id') FROM example LIMIT 1" map {_ getInt 0} collect 

    println(res0.head) 
    } 
} 

JSON Beispiel

{"id":529799371026485248,"text":"Example"} 

Der Code eine Länge des Feldes Wert von JSON (zB 'zurückkehren sollte id 'hat den Wert 18). Aber anstatt "18" zurückzugeben, gibt es "2" zurück, was die Länge von "id" ist, nehme ich an.

Also meine Frage ist, wie UDF neu zu schreiben, um es zu beheben?

Antwort

3

Das Problem ist, dass Sie die Zeichenfolge id als Literal an Ihre übergeben, so dass es als eine anstelle einer Spalte interpretiert wird Um dies zu lösen, ändern Sie einfach die Art, wie Sie die SQL Abfrage formulieren.

z.

val res0 = ctx sql "SELECT len10(id) FROM example LIMIT 1" map {_ getInt 0} collect 

// Or alternatively 
val len10 = udf(word => word.length) 
df.select(len10(df("id")).as("length")).show() 
Verwandte Themen