объединить несколько строк в Spark - PullRequest
0 голосов
/ 07 февраля 2020

Интересно, есть ли какой-нибудь простой способ объединить несколько строк в одну в Pyspark, я новичок в Python и Spark и использую Spark. sql большую часть времени.

Вот пример данных:

id      count1    count2   count3
 1       null       1       null
 1        3         null    null
 1        null      null      5
 2        null      1        null
 2        1         null     null
 2        null      null      2

ожидаемый результат:

 id      count1    count2   count3
 1       3          1       5
 2       1         1        2

Я использовал spark SQL, чтобы присоединиться к ним несколько раз, и удивляюсь если есть более простой способ сделать это.

Спасибо!

1 Ответ

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

Spark SQL будет суммировать null как ноль, поэтому, если вы знаете, что нет никаких «перекрывающихся» элементов данных, просто сгруппируйте по столбцу, к которому вы будете sh агрегировать, и суммируйте.

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

before.show()                                                                                                                                                                                      
+---+------+------+------+
| id|count1|count2|count3|
+---+------+------+------+
|  1|  null|     1|  null|
|  1|     3|  null|  null|
|  1|  null|  null|     5|
|  2|  null|     1|  null|
|  2|     1|  null|  null|
|  2|  null|  null|     2|
+---+------+------+------+

after = before
   .groupby('id').sum(*[c for c in before.columns if c != 'id'])
   .select([col(f"sum({c})").alias(c) for c in before.columns if c != 'id'])

after.show()                                                                                                                                                                                       
+------+------+------+
|count1|count2|count3|
+------+------+------+
|     3|     1|     5|
|     1|     1|     2|
+------+------+------+
...