Ваша ошибка - ссылаться на столбцы из таблицы, отсутствующей в плане выполнения.
Добавление crossJoin
исправит это:
dist_df <- df1 %>%
crossJoin(df2) %>%
withColumn("dist", levenshtein(df1$var1, df2$var2))
dist_df %>% head()
var1 var2 dist
1 rat cat3 2
2 rat bat1 2
3 rat dog 3
4 rat toy 3
5 cat cat3 1
6 cat bat1 2
Отсюда вы можете использовать стандартные методы ( Как выбрать первый ряд каждой группы? ), чтобы найти наиболее близкое совпадение, например:
best_matches <- dist_df %>%
groupBy("var2") %>%
agg(struct(dist_df$dist, dist_df$var1) %>% min() %>% alias("match"))
threshold <- 1 # Maximum match distance to keep
result <- best_matches %>%
select(
best_matches$var2,
when(best_matches$match.dist <= threshold, best_matches$match.var1) %>%
alias("var1"))
result %>% head()
var2 var1
1 dog <NA>
2 bat1 bat
3 cat3 cat
4 toy <NA>
Пожалуйста, имейте в виду, что этот подход очень неэффективен. Spark предоставляет лучшие параметры ( Эффективное сопоставление строк в Apache Spark ), но они еще не представлены в SparkR и лишь частично реализованы в sparklyr
.
Если вы хотите сохранить все записи, независимо от качества, просто удалите when
:
best_matches %>% select(best_matches$var2, best_matches$match.var1) %>% head()
var2 var1
1 dog bat
2 bat1 bat
3 cat3 cat
4 toy bat