Объединить два искровых кадра данных на основе столбца

У меня есть 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()

Другие вопросы по тегам