#apache-spark #pyspark #spark-dataframe
#apache-spark #pyspark #apache-spark-sql
Вопрос:
У меня есть фрейм данных Pyspark с такой структурой:
---- ---- ---- ---- ---
|user| A/B| C| A/B| C |
---- ---- -------------
| 1 | 0| 1| 1| 2|
| 2 | 0| 2| 4| 0|
---- ---- ---- ---- ---
Изначально у меня было два фрейма данных, но я внешне соединил их, используя user в качестве ключа, поэтому там могли быть и нулевые значения. Я не могу найти способ суммировать столбцы с одинаковым именем, чтобы получить фрейм данных, подобный этому:
---- ---- ----
|user| A/B| C|
---- ---- ----
| 1 | 1| 3|
| 2 | 4| 2|
---- ---- ----
Также обратите внимание, что может быть много одинаковых столбцов, поэтому выделение буквально каждого столбца не является вариантом. В pandas это было возможно с использованием «user» в качестве индекса, а затем добавлением обоих фреймов данных. Как я могу это сделать в Spark?
Ответ №1:
У меня есть обходной путь для этого
val dataFrameOneColumns=df1.columns.map(a=>if(a.equals("user")) a else a "_1")
val updatedDF=df1.toDF(dataFrameOneColumns:_*)
Теперь выполните объединение, после чего вывод будет содержать значения с разными именами
Затем создайте кортеж списка для объединения
val newlist=df1.columns.filter(_.equals("user").zip(dataFrameOneColumns.filter(_.equals("user"))
И они объединяют значения столбцов внутри каждого кортежа и получают желаемый результат!
PS: я предполагаю, что вы можете написать логику для объединения! Так что я не кормлю с ложечки!
Комментарии:
1. Я выполнил первый шаг присвоения имени первому фрейму данных столбцам с _1 в качестве суффикса, но из-за вас я немного заблудился на втором шаге. Не могли бы вы, пожалуйста, переписать его на Python (Pyspark)? Вы написали это в Scala.
2. Извините, я не настолько хорошо знаком с python, но я могу рассказать вам концепцию, я просто создаю кортеж из имен столбцов, которые кажутся знакомыми, а затем применяю функцию sum к двум значениям кортежа, чтобы получить результат.