Scala spark: сумма всех столбцов по всем строкам - PullRequest
2 голосов
/ 28 февраля 2020

Я могу сделать это довольно легко с

df.groupBy().sum()

Но я не уверен, что groupBy() не добавляет дополнительного влияния на производительность или это просто плохой стиль. Я видел, как это было сделано с

df.agg( ("col1", "sum"), ("col2", "sum"), ("col3", "sum"))

, который пропускает (я считаю ненужным groupBy), но имеет свое собственное уродство. Какой правильный способ сделать это? Есть ли разница между использованием .groupBy().<aggOp>() и .agg?

1 Ответ

2 голосов
/ 28 февраля 2020

Если вы отметите Physical plan для обоих запросов, вызовите внутренние вызовы одного и того же плана, чтобы мы могли использовать любой из них!

Я думаю, что с помощью df.groupBy().sum() будет удобно, так как нам не нужно указывать все имена столбцов.

Example:

val df=Seq((1,2,3),(4,5,6)).toDF("id","j","k")

scala> df.groupBy().sum().explain
== Physical Plan ==
*(2) HashAggregate(keys=[], functions=[sum(cast(id#7 as bigint)), sum(cast(j#8 as bigint)), sum(cast(k#9 as bigint))])
+- Exchange SinglePartition
   +- *(1) HashAggregate(keys=[], functions=[partial_sum(cast(id#7 as bigint)), partial_sum(cast(j#8 as bigint)), partial_sum(cast(k#9 as bigint))])
      +- LocalTableScan [id#7, j#8, k#9]

scala> df.agg(sum("id"),sum("j"),sum("k")).explain
== Physical Plan ==
*(2) HashAggregate(keys=[], functions=[sum(cast(id#7 as bigint)), sum(cast(j#8 as bigint)), sum(cast(k#9 as bigint))])
+- Exchange SinglePartition
   +- *(1) HashAggregate(keys=[], functions=[partial_sum(cast(id#7 as bigint)), partial_sum(cast(j#8 as bigint)), partial_sum(cast(k#9 as bigint))])
      +- LocalTableScan [id#7, j#8, k#9]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...