Использование функций Word2Vec внутри UDF в Apache Spark (v2.3.1) - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть датафрейм, который состоит из двух столбцов, одного Int и другого Строка:

+-------------+---------------------+
|user_id      |token                |
+-------------+---------------------+
|          419|                 Cake|
|          419|            Chocolate|
|          419|               Cheese|
|          419|                Cream|
|          419|                Bread|
|          419|                Sugar|
|          419|               Butter|
|          419|              Chicken|
|          419|               Baking|
|          419|             Grilling|
+-------------+---------------------+

Мне нужно найти 250 ближайших токенов в словаре Word2Vec, для каждого токена в столбце «токен». Я попытался использовать метод findSynonymsArray в udf:

def getSyn( w2v : Word2VecModel ) = udf { (token : String) => w2v.findSynonymsArray(token, 10)}

Однако этот udf вызывает NullPointerException при использовании с withColumn. Это исключение возникает, даже если токен жестко запрограммирован, и независимо от того, выполняется ли код локально или в режиме кластера. Я использовал try-catch внутри udf, чтобы поймать нулевой указатель, и он поднимается в каждой строке.

Я запросил фрейм данных для нулевых значений, ни в одном столбце их нет.

Я также пытался извлечь слова и векторы из Word2VecModel с помощью getVectors, запустив свой udf для слов на этом кадре данных и выполнив внутреннее соединение с моим кадром данных. Возникает то же исключение.

Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 14 ноября 2018

Это ожидаемый результат Word2VecModel - это распределенная модель, и ее методы реализуются с использованием операций RDD. Из-за этого его нельзя использовать внутри udf, map или любого другого кода на стороне исполнителя.

Если вы хотите вычислить синонимы для всего DataFrame, вы можете попробовать сделать это вручную.

...