Как найти сумму массивов в столбце, который сгруппирован по значениям другого столбца в кадре данных искры, используя scala - PullRequest
0 голосов
/ 26 июня 2019

У меня есть dataframe, как показано ниже

c1             Value
A             Array[47,97,33,94,6]
A             Array[59,98,24,83,3]
A             Array[77,63,93,86,62]
B             Array[86,71,72,23,27]
B             Array[74,69,72,93,7]
B             Array[58,99,90,93,41]
C             Array[40,13,85,75,90]
C             Array[39,13,33,29,14]
C             Array[99,88,57,69,49]

Мне нужен вывод, как показано ниже.

c1             Value
A             Array[183,258,150,263,71]
B             Array[218,239,234,209,75]
C             Array[178,114,175,173,153]

Что является ничем иным, как группировкой столбец c1 и найдите сумму значений в столбце значение последовательно.Пожалуйста, помогите, я не смог найти способ сделать это в Google.

1 Ответ

1 голос
/ 26 июня 2019

Это не очень сложно.Как вы упомянули, вы можете просто сгруппировать по «c1» и агрегировать значения индекса массива по индексу.

Давайте сначала сгенерируем некоторые данные:

val df = spark.range(6)
    .select('id % 3 as "c1",
            array((1 to 5).map(_ => floor(rand * 10)) : _*) as "Value")
df.show()
+---+---------------+
| c1|          Value|
+---+---------------+
|  0|[7, 4, 7, 4, 0]|
|  1|[3, 3, 2, 8, 5]|
|  2|[2, 1, 0, 4, 4]|
|  0|[0, 4, 2, 1, 8]|
|  1|[1, 5, 7, 4, 3]|
|  2|[2, 5, 0, 2, 2]|
+---+---------------+

Затем нам нужно выполнить итерациюпо значениям массива, чтобы агрегировать их.Это очень похоже на то, как мы их создали:

val n = 5 // if you know the size of the array
val n = df.select(size('Value)).first.getAs[Int](0) // If you do not
df
    .groupBy("c1")
    .agg(array((0 until n).map(i => sum(col("Value").getItem(i))) :_* ) as "Value")
    .show()
+---+------------------+
| c1|             Value|
+---+------------------+
|  0|[11, 18, 15, 8, 9]|
|  1|  [2, 10, 5, 7, 4]|
|  2|[7, 14, 15, 10, 4]|
+---+------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...