Spark UDF返回字段长度而不是值的长度

时间:2016-07-24 21:36:48

标签: json scala apache-spark apache-spark-sql

考虑以下代码

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来修复它?

1 个答案:

答案 0 :(得分: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()