如果我有一列数字,如何将它们相乘?
val numbers = Seq((2, 7),(1, 9),(10, 0)).toDF("A", "B")
想要的答案
val ResultWant = Seq(20, 0).toDF("A", "B")
我注意到没有Key或agg(multiply)函数的reduce,这很烦人。
我能想到的最好的方法是将每一列写为一个数组,然后使用reducebyleft函数将所有内容相乘,然后将它们重新打包在一起。
val A = numbers.select($"A").map(r => r.getInt(0)).collect
val AWant = A.reduceLeft((x,y) => x * y)
还有其他更有效的方法吗? 还有其他建议吗?
答案 0 :(得分:0)
我能想到的最好的方法是将每一列写为一个数组,然后使用reducebyleft函数将所有内容相乘,然后将它们重新打包在一起。
val A = numbers.select($"A").map(r => r.getInt(0)).collect
val AWant = A.reduceLeft((x,y) => x * y)
还有其他更有效的方法吗?还有其他建议吗?
答案 1 :(得分:0)
我建议创建一个架构,以将您的DataFrame
变成Dataset
,然后使用reduce()
。您可以使用DataFrame
来进行管理,但这比较麻烦。
scala> case class rowSchema(A : Int, B : Int)
defined class rowSchema
scala> val ds = numbers.as[rowSchema]
ds: org.apache.spark.sql.Dataset[rowSchema] = [A: int, B: int]
scala> val product = ds.reduce((r1, r2) => rowSchema(r1.A * r2.A, r1.B * r2.B))
product: rowSchema = rowSchema(20,0)
答案 2 :(得分:0)
Reduce无需收集即可使用:
val numbers = Seq((2, 7),(1, 9),(10, 0)).toDF("A", "B")
val result = numbers.select("A").reduce((acc, curr) => Row(acc.getInt(0) * curr.getInt(0)))
println(result.getInt(0))
输出: 20