Scala 在ApacheSpark(v2.3.1)中的UDF中使用Word2Vec函数

Scala 在ApacheSpark(v2.3.1)中的UDF中使用Word2Vec函数,scala,apache-spark,user-defined-functions,word2vec,apache-spark-ml,Scala,Apache Spark,User Defined Functions,Word2vec,Apache Spark Ml,我有一个数据框,它由两列组成,一列是Int,另一列是Int 字符串: +-------------+---------------------+ |user_id |token | +-------------+---------------------+ | 419| Cake| | 419| Chocolate| | 419|

我有一个数据框,它由两列组成,一列是Int,另一列是Int 字符串:

+-------------+---------------------+
|user_id      |token                |
+-------------+---------------------+
|          419|                 Cake|
|          419|            Chocolate|
|          419|               Cheese|
|          419|                Cream|
|          419|                Bread|
|          419|                Sugar|
|          419|               Butter|
|          419|              Chicken|
|          419|               Baking|
|          419|             Grilling|
+-------------+---------------------+
我需要在Word2Vec词汇表中为“token”列中的每个标记找到250个最接近的标记。我尝试在udf中使用
findSynoymArray
方法:

def getSyn( w2v : Word2VecModel ) = udf { (token : String) => w2v.findSynonymsArray(token, 10)}
但是,当与
with column
一起使用时,此udf会导致
NullPointerException
。即使令牌是硬编码的,也会发生此异常,无论代码是在本地运行还是在集群模式下运行。我在udf中使用了一个try-catch来捕获空指针,它在每一行上都被提升

我查询了dataframe中的空值,这两列中都没有

我还尝试使用
getVectors
Word2VecModel
中提取单词和向量,在此数据帧上运行我的udf,并与我的数据帧进行内部联接。提出了同样的例外情况


非常感谢您的帮助。

这是一个预期结果
Word2VecModel
是一个分布式模型,其方法是使用
RDD
操作实现的。因此,它不能在
udf
map
或任何其他执行器端代码中使用

如果要计算整个
数据帧的同义词,可以尝试手动进行

  • 直接将模型加载为
    DataFrame
    ,如中所示
  • 转换输入数据
  • 使用或叉积合并并过滤结果

谢谢,事实证明这是正确的。我们决定用Python更好地解决特定的Word2Vec问题,但仍然使用Spark提取训练数据。