У меня есть пользовательская функция (UDF), которая добавляет новый столбец к кадру данных искры, но она немного медленная.
UDF вычисляет расстояние редактирования между пользовательским вводом и списком правильно написанных слов, и я надеялся ускорить его, сохранив пользовательский ввод и наиболее близкое совпадение слов в глобальном словаре.Идея состоит в том, чтобы сначала обратиться к глобальному словарю, а затем снова потратить время на подсчет баллов по всем словам.
Я новичок в Spark / PySpark, поэтому не знаю всех правильных терминов, но из того, что я прочитал, звучит так, что исполнители не отслеживают глобальные переменные в потоках (или что-то в этом роде)).Я также читал о переменных Broadcast, но я думаю, что они передаются в качестве входных данных, и аккумуляторы допускают только числовые данные.
Вот пример кода, с которым я сейчас работаю:
def guess_word(user_entry):
user_entry= user_entry.upper().strip()
# Check if the best match has already been calculated from a previous row,
# if not, calculate scores and return the one with the lowest score
if user_entry not in global_dict:
scores = {}
# Calculate scores against every word
for word in word_dataset:
word= word.upper().strip()
if word not in scores:
scores[word] = distance(user_entry, word)
else:
continue
# Get the word with the lowest score (aka best match)
word_guess, score = sorted(scores.items(), key=lambda kv: kv[1])[0]
# Update the global dictionary
global_dict[user_entry] = (word_guess,score)
else:
word_guess = global_dict[user_entry]
return word_guess
global_dict = {}
guess_word_udf = udf(lambda x: guess_word(x), StringType())
user_data = user_data.withColumn('word_guess', guess_word_udf('user_entry'))
После запуска этогокод, global_dict всегда пуст после выполнения этого кода.Можно ли ...
Я только что понял, что мне не нужен словарь после завершения работы UDF, и этот вопрос теперь бессмысленен: D