我正在尝试使用spark的word2vec创建一个字典。在这个过程中,我创建了一个包含大约200个单词的Array,并对每个单词应用find同义词函数。然而,在这200个单词中,会有一些单词不会返回任何同义词(我想这是由于训练数据的大小)。然后,spark函数将抛出一个异常,触发进程停止。
我要做的是尝试捕获此异常,以便如果单词不生成任何同义词,则移动到下一个并返回未知或null之类的内容。
这是我一直在做的:
val synonyms = sc.parallelize(listwords map{x=> (x, try {model.findSynonyms(x, 30)} catch {case e: Exception => ("Exception",0.0) })})
但是,使用Try和Catch将值同义词的类型转换为java.io.Serializable,而不是(String, Double)对
我做错了什么尝试和捕捉?有更好的方法吗?
您的catch {}
应该返回Double
,而不是(String, Double)
。否则,编译器将尝试找到Double
(由try{}返回)和(String, Double)
(在异常情况下由catch{}返回)的共同父级,这是Serializable。
你真的想在parallelize
之前做map
吗?还是之后?
我会这样写(首先并行化listWords以获得一个rdd,然后在这个rdd上执行map):
val synonyms = sc.parallelize(listwords) map { x =>
(x, try {model.findSynonyms(x, 30)} catch {case e: Exception => 0.0})
}