在 Apache Spark (v2.3.1) 的 UDF 中使用 Word2Vec 函数
Using Word2Vec functions inside of a UDF in Apache Spark (v2.3.1)
我有一个由两列组成的数据框,一列是 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:
中使用 findSynonymsArray
方法
def getSyn( w2v : Word2VecModel ) = udf { (token : String) => w2v.findSynonymsArray(token, 10)}
但是,此 udf 在与 withColumn
一起使用时会导致 NullPointerException
。即使令牌是硬编码的,也不管代码是 运行 本地还是集群模式,都会发生此异常。我在 udf 中使用了一个 try-catch 来捕获空指针,并且它在每一行都被引发。
我查询了数据框的空值,两列中都有 none。
我还尝试使用 getVectors
从 Word2VecModel
中提取单词和向量,运行 在这个数据帧上的单词上使用我的 udf,并与我的数据帧进行内部连接.引发了相同的异常。
如有任何帮助,我将不胜感激。
这是预期的结果 Word2VecModel
是一个分布式模型,其方法是使用 RDD
操作实现的。因此,它不能在 udf
、map
或任何其他执行程序端代码中使用。
如果您想计算整个 DataFrame
的同义词,您可以尝试手动完成。
- 直接将模型加载为
DataFrame
,如 中所示
- 转换输入数据。
- 使用 approximate join 或叉积合并两者并过滤结果。
我有一个由两列组成的数据框,一列是 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:
中使用findSynonymsArray
方法
def getSyn( w2v : Word2VecModel ) = udf { (token : String) => w2v.findSynonymsArray(token, 10)}
但是,此 udf 在与 withColumn
一起使用时会导致 NullPointerException
。即使令牌是硬编码的,也不管代码是 运行 本地还是集群模式,都会发生此异常。我在 udf 中使用了一个 try-catch 来捕获空指针,并且它在每一行都被引发。
我查询了数据框的空值,两列中都有 none。
我还尝试使用 getVectors
从 Word2VecModel
中提取单词和向量,运行 在这个数据帧上的单词上使用我的 udf,并与我的数据帧进行内部连接.引发了相同的异常。
如有任何帮助,我将不胜感激。
这是预期的结果 Word2VecModel
是一个分布式模型,其方法是使用 RDD
操作实现的。因此,它不能在 udf
、map
或任何其他执行程序端代码中使用。
如果您想计算整个 DataFrame
的同义词,您可以尝试手动完成。
- 直接将模型加载为
DataFrame
,如 中所示
- 转换输入数据。
- 使用 approximate join 或叉积合并两者并过滤结果。