Multiply DF Column Spala Spark - PullRequest
       14

Multiply DF Column Spala Spark

0 голосов
/ 12 июля 2019

Если у меня есть столбец чисел, как мне их умножить?

val numbers = Seq((2, 7),(1, 9),(10, 0)).toDF("A", "B")

Ответить Хотите

val ResultWant = Seq(20, 0).toDF("A", "B")

Я заметил, что нет функции уменьшения по ключу или агг (умножение), что раздражает.

Лучший способ, который я могу придумать, - выписать каждый столбец как массив, а затем использовать функцию redubyleft, чтобы умножить все, а затем переупаковать все вместе.

val A = numbers.select($"A").map(r => r.getInt(0)).collect
val AWant = A.reduceLeft((x,y) => x * y)

Есть ли другой, более эффективный способ?Любые другие предложения?

Ответы [ 3 ]

0 голосов
/ 12 июля 2019

Я бы порекомендовал создать схему, чтобы превратить ваш 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)

0 голосов
/ 12 июля 2019

Снижение можно использовать без сбора:

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

0 голосов
/ 12 июля 2019

Лучший способ, который я могу придумать, - записать каждый столбец как массив, а затем использовать функцию redubyleft, чтобы умножить все, а затем переупаковать все вместе.

val A = numbers.select($"A").map(r => r.getInt(0)).collect
val AWant = A.reduceLeft((x,y) => x * y)

Есть ли другой, более эффективный способ? Любые другие предложения?

...