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

Json Spark UDF返回字段的长度,而不是值的长度,json,scala,apache-spark,apache-spark-sql,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

考虑下面的代码

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

问题是,您将字符串
id
作为文本传递给
UDF
,因此它被解释为一个而不是一列(请注意,它有两个字母,这就是为什么它返回这样的数字)。要解决这个问题,只需改变制定
SQL
查询的方式

例如

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