考虑以下代码
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来修复它?
答案 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()