Scala 在ApacheSpark(v2.3.1)中的UDF中使用Word2Vec函数
我有一个数据框,它由两列组成,一列是Int,另一列是Int 字符串: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|
+-------------+---------------------+
|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提取训练数据。