我有geoareas表和places表,在places表中我只有geoarea_id,在geoareas表中我有id和名称
我的目标是创建一个接受geoarea_id数组并转换为名称数组的函数
声明表:
on_failure
功能:
val geoareas =
(
spark.table("location.geoareas")
)
val places =
(
spark.table("location.places")
.select('id, 'name, 'geoareas, 'lat, 'lng)
)
当我测试唯一序列时,它会起作用:
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.functions.{concat,lit}
import org.apache.spark.sql.Row
import scala.collection.mutable
def _searchGeocode(origin:Seq[String]): Seq[String] = {
var retlist = Seq("@")
for (i <- origin){
val procvalue = geoareas.where('id ===i).select(concat('adminlevel, lit(":"), 'name)).collect()(0).toString.replace("[","").replace("]","")
retlist ++= Seq(procvalue)
}
retlist.filter(!_.contains("@"))
}
它返回
val test = Seq("59138c8a03205749cd00ceb3", "59138ad003205749cdfac6c4", "59138adf03205749cdfb0067", "59138ace03205749cdfabeeb")
_searchGeocode(test).filter(!_.contains("@"))
Obs:数字是geoarea_id的admin_level,有了它,我知道它是否是国家/地区,州/省...
当我尝试转换整个列时出现错误:
Seq[String] = List(6:McHenry County, 8:Woodstock, 2:United States of America, 4:Illinois)
它把我扔了
spark.udf.register("searchGeocode", _searchGeocode _)
val searchGeocode = udf(_searchGeocode _)
places.limit(10).select('geoareas).where('geoareas.isNotNull).withColumn("test", searchGeocode('geoareas)).show()
我做错了什么?
答案 0 :(得分:0)
还没有测试过,但是我想你想做这样的事情:
val searchGeocode = udf(_searchGeocode)
places.limit(10).select('geoareas).where('geoareas.isNotNull).withColumn("test", searchGeocode('geoareas)).show()
使用_
函数时,我认为您不需要udf
占位符。