Мы используем пользовательскую функцию (UDF) для выполнения «деления карты» на два столбца MapType в наборе данных. «Подразделение карты» означает создание новой карты с ключами, которые являются общими для делимого и делителя, и значениями, которые являются значением дивиденда, деленным на значение делителя для этого ключа. Код Scala для создания UDF показан ниже.
def mapDivision(dividend: Map[String, Double], divisor: Map[String, Long]): Map[String, Double] = {
var result = Map.empty[String, Double]
for ((key, value) <- dividend) if (divisor.contains(key)) result += (key -> value / divisor(key))
result
}
Мы хотели бы выполнить эту операцию без использования этой UDF, потому что UDF не могут быть оптимизированы с помощью Catalyst Engine и работают медленно. Мы попытались выполнить эту операцию, используя только Spark SQL API, чтобы добиться повышения производительности по сравнению с UDF, но не смогли найти хороший способ сделать это, который работает и на самом деле не медленнее из-за обходных соединений и т.д.
Кто-нибудь знает быстрый и простой способ выполнения этой операции с использованием Spark SQL API?