Apache spark 访问广播变量时引发UDF异常

Apache spark 访问广播变量时引发UDF异常,apache-spark,broadcast,udf,notserializableexception,Apache Spark,Broadcast,Udf,Notserializableexception,从spark UDF内部访问scala.collection.immutable.Map时遇到困难 我正在广播地图 val browserLangMap = sc.broadcast (Source.fromFile(browserLangFilePath).getLines.map(_.split(,)).map(e => (e(0).toInt,e(1))).toMap) 创建访问地图的UDF def addBrowserCode = udf((browserLang:Int) =&

从spark UDF内部访问
scala.collection.immutable.Map时遇到困难

我正在广播地图

val browserLangMap = sc.broadcast (Source.fromFile(browserLangFilePath).getLines.map(_.split(,)).map(e => (e(0).toInt,e(1))).toMap)
创建访问地图的UDF

def addBrowserCode = udf((browserLang:Int) => if(browserLangMap.value.contains(browserLang)) browserLangMap.value(browserLang) else "")`
使用UDF添加新列

val joinedDF = rawDF.join(broadcast(geoDF).as("GEO"), $"start_ip" === $"GEO.start_ip_num", "left_outer")
                        .withColumn("browser_code", addBrowserCode($"browser_language"))
                        .selectExpr(getSelectQuery:_*)
完整堆栈跟踪-->

我知道是访问广播地图造成的。当我删除UDF中对它的引用时,也没有例外

def addBrowserCode = udf((browserLang:Int) => browserLang.toString())  //Test UDF without accessing broadcast Map and it works

Spark版本1.6

我发现Spark外壳中的“:paste”出现了一种奇怪的行为。只有当我使用:paste将整个代码粘贴到一个多行粘贴中时,才会发生这种情况

如果我先粘贴广播和UDF创建,然后将join+saveToFile粘贴到一个单独的:paste中,同样的代码也可以完美地工作


可能是外壳问题。我不知道。

根本原因与在广播变量的代码中声明
val sc:SparkContext=spark.SparkContext
有关。如果代码在spark shell上运行,则默认情况下sc已可用。两次声明sc(一次默认,一次在代码中)会导致此“任务不可序列化”问题。因此,与之前的回答不同,火花壳没有问题。只要在spark shell中暂时删除SparkContext声明,代码就可以了。

您可以:a)设置问题格式-很难阅读,b)提供所有对象的类型c)提供示例输入d)解释如何执行此操作(
spark shell
spark submit
)很抱歉,你们觉得这个问题很难理解。今天我试着做一个更简单的例子,无意中发现了解决方案:-)从他的代码中,我看不出他在重新声明
sc
。他正在播送spark-shell已经给出的spark上下文中的变量。这里还有一些奇怪之处
def addBrowserCode = udf((browserLang:Int) => browserLang.toString())  //Test UDF without accessing broadcast Map and it works