Добавление столбцов в фрейм данных Pyspark

#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 к двум значениям кортежа, чтобы получить результат.