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