Объединить два искровых кадра данных на основе столбца
У меня есть 2 кадра данных, которые мне нужно объединить на основе столбца (код сотрудника). Обратите внимание, что в фрейме данных содержится около 75 столбцов, поэтому я предоставляю пример набора данных, чтобы получить некоторые предложения / примеры решений. Я использую блоки данных, и наборы данных читаются из S3.
Ниже приведены мои два кадра данных:
DATAFRAME - 1
|-----------------------------------------------------------------------------------|
|EMP_CODE |COLUMN1|COLUMN2|COLUMN3|COLUMN4|COLUMN5|COLUMN6|COLUMN7|COLUMN8|COLUMN9|
|-----------------------------------------------------------------------------------|
|A10001 | B | | | | | | | | |
|-----------------------------------------------------------------------------------|
DATAFRAME - 2
|-----------------------------------------------------------------------------------|
|EMP_CODE |COLUMN1|COLUMN2|COLUMN3|COLUMN4|COLUMN5|COLUMN6|COLUMN7|COLUMN8|COLUMN9|
|-----------------------------------------------------------------------------------|
|A10001 | | | | | C | | | | |
|B10001 | | | | | | | | |T2 |
|A10001 | | | | | | | | B | |
|A10001 | | | C | | | | | | |
|C10001 | | | | | | C | | | |
|-----------------------------------------------------------------------------------|
Мне нужно объединить 2 кадра данных на основе EMP_CODE, в основном объединить dataframe1 с dataframe2 на основе emp_code. Я получаю дубликаты столбцов, когда я выполняю объединение, и мне нужна помощь.
Ожидаемый окончательный кадр данных:
|-----------------------------------------------------------------------------------|
|EMP_CODE |COLUMN1|COLUMN2|COLUMN3|COLUMN4|COLUMN5|COLUMN6|COLUMN7|COLUMN8|COLUMN9|
|-----------------------------------------------------------------------------------|
|A10001 | B | | C | | C | | | B | |
|B10001 | | | | | | | | |T2 |
|C10001 | | | | | | C | | | |
|-----------------------------------------------------------------------------------|
В dataframe1 есть 3 строки с emp_code A10001 и 1 строка в dataframe2. Все данные должны быть объединены в одну запись без повторяющихся столбцов.
Большое спасибо
3 ответа
Сначала вам нужно объединить отдельные кадры данных.
from pyspark.sql import functions as F
df1 = df1.groupBy('EMP_CODE').agg(F.concat_ws(" ", F.collect_list(df1.COLUMN1)))
Вы должны написать это для всех столбцов и для всех кадров данных. Тогда вам придется использовать функцию объединения на всех фреймах данных.
df1.union(df2)
и затем повторите ту же агрегацию на этом объединенном фрейме данных.
Вы можете использовать внутреннее соединение
output = df1.join(df2,['EMP_CODE'],how='inner')
также вы можете применить отчет в конце, чтобы удалить дубликаты.
output = df1.join(df2,['EMP_CODE'],how='inner').distinct()
Вы можете использовать приведенный ниже код, если оба df имеют некоторое имя столбца ключа соединения
df1.join(df2, "EMP_CODE")
Вы можете сделать это в scala, если оба фрейма данных имеют одинаковые столбцы,
output = df1.union(df2)
Вам нужен союз.
Если оба фрейма данных имеют одинаковое количество столбцов и столбцы, которые должны быть объединены, позиционно одинаковы (как в вашем примере), это будет работать:
output = df1.union(df2).dropDuplicates()
Если оба фрейма данных имеют одинаковое количество столбцов и столбцы, которые необходимо объединить, имеют одно и то же имя (как и в вашем примере), это будет лучше:
output = df1.unionByName(df2).dropDuplicates()