2016-07-24 104 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()