2016-07-24 68 views
1

考慮下面火花UDF返回字段的代替值長度的一個長度

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示例代碼

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

的代碼應返回從JSON字段值的長度(例如,「 ID'具有值18)。但不是返回'18',而是返回'2',這是'id'的長度,我想。

所以我的問題是如何重寫UDF來解決它?

回答

3

問題是,您將字符串id作爲文字傳遞給您的UDF,因此它被解釋爲一個而不是列(注意它有兩個字母,這就是它返回這個數字的原因)。要解決這個問題,只需改變制定SQL查詢的方式。

E.g.

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