我一直试图解决这个问题几天,但没有得到任何结果 - 会喜欢一些建议。
我正在项目中运行一个scala对象,其中包含一个广播scala集(dict
)的udf。这是从IntelliJ IDE运行的,项目是用Maven构建的
现在,当我在同一个项目中包含的另一个对象(在数据帧中使用虚拟数据)中运行它时,这个udf运行正常,但是当我在数据帧中的实际数据上运行相同的代码时,我得到{{1错误。
关键的udf代码是:
java.lang.ClassCastException
我认为它可能是spark或scala版本不匹配错误,但已检查我的pom文件以确保所有版本都正确并已从maven存储库重新下载它们。
真正做到这一点的是,它使用精确的SAME项目设置(相同的pom文件和依赖项,所有上传到spark作为带有依赖项的胖jar)在虚拟数据上运行,而不在真实数据上运行)。在真实的数据代码中有额外的代码可以抓取和管理数据(并且工作得很好),但是当它涉及到完全相同的udf时会失败 - 这怎么可能?
完整的错误堆栈是:
// does an exact match check against a set (Bool)
def listCheckExact(words: Broadcast[scala.collection.immutable.Set[String]]) = {
udf { (s: String) => words.value.contains(s) }
}
df.withColumn("new_col", when(listCheckExact(sparkSession.sparkContext.broadcast(dict))($"column"), 1).otherwise(0) )