Spark Scala上的java.lang.NullPointerException问题

时间:2019-10-07 15:45:52

标签: scala apache-spark

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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

还没有测试过,但是我想你想做这样的事情:

val searchGeocode = udf(_searchGeocode)

places.limit(10).select('geoareas).where('geoareas.isNotNull).withColumn("test", searchGeocode('geoareas)).show()

使用_函数时,我认为您不需要udf占位符。