考虑下面的代码
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()