乘以DF列Scala Spark

时间:2019-07-11 21:26:02

标签: scala apache-spark pyspark apache-spark-sql bigdata

如果我有一列数字,如何将它们相乘?

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)

还有其他更有效的方法吗? 还有其他建议吗?

3 个答案:

答案 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