У вас есть 2 варианта:
Решение 1- Ваши данные большие, поэтому вы должны придерживаться данных. Таким образом, чтобы применить функцию к каждой строке. Мы должны определить UDF.
Решение 2- Ваши данные невелики, затем вы можете собрать данные на машине-драйвере и затем выполнить итерацию с картой.
Пример:
val df = Seq((1,2,3), (4,5,6)).toDF("a", "b", "c")
def sum(a: Int, b: Int, c: Int) = a+b+c
// Solution 1
import org.apache.spark.sql.Row
val myUDF = udf((r: Row) => sum(r.getAs[Int](0), r.getAs[Int](1), r.getAs[Int](2)))
df.select(myUDF(struct($"a", $"b", $"c")).as("sum")).show
//Solution 2
df.collect.map(r=> sum(r.getAs[Int](0), r.getAs[Int](1), r.getAs[Int](2)))
Выход для обоих случаев:
+---+
|sum|
+---+
| 6|
| 15|
+---+
РЕДАКТИРОВАТЬ:
val myUDF = udf((r: Row) => {
val value1 = r.getAs[Int](0)
val value2 = r.getAs[Int](1)
val value3 = r.getAs[Int](2)
myFunction(value1, value2, value3)
})