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

问题是,您将字符串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()

相关内容

  • 没有找到相关文章

最新更新