Начиная с Spark 1.6 вы можете использовать функцию pivot
на GroupedData
и предоставить обобщенное выражение.
pivoted = (df
.groupBy("ID", "Age")
.pivot(
"Country",
['US', 'UK', 'CA']) # Optional list of levels
.sum("Score")) # alternatively you can use .agg(expr))
pivoted.show()
## +---+---+---+---+---+
## | ID|Age| US| UK| CA|
## +---+---+---+---+---+
## |X01| 41| 3| 1| 2|
## |X02| 72| 4| 6| 7|
## +---+---+---+---+---+
Уровни могут быть опущены, но если они могут повысить производительность и служит в качестве внутреннего фильтра.
Этот метод по-прежнему относительно медленный, но, конечно, бит вручную передает данные вручную между JVM и Python.
Хорошо, таким образом, стандартные алгоритмы:
1) Расстояние Хемминга , Только хорошее для строк той же длины, но очень эффективное. В основном это просто считает количество отличных символов. Не полезный для нечеткого поиска текста естественного языка.
2) расстояние Levenstein . Расстояние Levenstein измеряет расстояние с точки зрения количества "операций", требуемых преобразовать одну строку другому. Эти операции включают вставку, удаление и substition. Стандартный подход вычисления расстояния Levenstein должен использовать динамическое программирование.
3) Обобщенный Levenstein / (Damerau†“расстояние Левенштейна) Это расстояние также учитывает перемещения символов, одним словом, и является, вероятно, расстоянием редактирования, самым подходящим для нечеткого соответствия вручную-введенного-текста. Алгоритм для вычислений расстояния немного более включен, чем расстояние Levenstein (обнаруживающий перемещения, не легко). Наиболее распространенные реализации являются модификацией алгоритм bitap (как grep).
В целом Вы, вероятно, хотели бы считать реализацию третьей опции реализованной в своего рода ближайшем соседнем поиске на основе k-d дерева
Damerau-расстояние-Левенштейна подобно расстоянию Левенштейна, но также и включает перемещение с двумя символами. (связанная) страница Википедии включает псевдокод, который должен быть довольно тривиальным для реализации.