Сумма столбца в sqlDataframe без использования функций groupBy или agg в scala / spark - PullRequest
0 голосов
/ 11 декабря 2019

Для данных, указанных ниже, я хочу новый столбец в данных, который должен иметь постоянное значение суммы столбца частоты.

+------+----+
|number|freq|
+------+----+
|     8|   1| 
|     6|   2|     
|     2|   4|    
+------+----+

Результат должен выглядеть как

+------+----+-------+
|number|freq|new_col|
+------+----+-------+
|     8|   1|      7|
|     6|   2|      7|
|     2|   4|      7|
+------+----+-------+

, и я хочу это без groupBy или agg. Я пытался:

var x = sum(df("freq"))
df.withColumn("new_col",lit(x))

или

df.withColumn("new_col",x)

или

df.withColumn("new_col",sum($"freq"))

Но ни один не помог.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2019

Для этого вы можете использовать окно на всем фрейме данных, но я настоятельно рекомендую не делать этого, потому что все данные должны идти только в один раздел, что было бы ужасно с точки зрения производительности.

Простой способ сделать это, очень похожий на ваш первый подход, это:

import org.apache.spark.sql.Row
val Row(x) = df.select(sum('freq)).head
val new_df = df.withColumn("new_col", lit(x))
0 голосов
/ 11 декабря 2019

Вы можете попробовать это, но будьте осторожны, он использует один раздел:

import spark.implicits._
import org.apache.spark.sql.functions._

val df = Seq(
  (8,1),
  (6,2),
  (2,4)
).toDF("number","freq")


df.withColumn("new_col", sum($"freq").over())
  .show(false)

+------+----+-------+
|number|freq|new_col|
+------+----+-------+
|8     |1   |7      |
|6     |2   |7      |
|2     |4   |7      |
+------+----+-------+
...