Как сделать левое соединение, чтобы ключи могли иметь множественную степень детализации с помощью Spark?

У меня есть пример таблицы, в которой представлена ​​зарплата всех сотрудников компании:

РАСТЕНИЕ ДЕПТО ИМЯ ЗАРПЛАТА 1 МГ КЕВИН 1.100 2 СП ИТАН 1.200 3 ДФ ХУАН 1.200 4 СП БЕТ 110 5 СП ДЖОН 1.000

А также есть еще одна таблица, показывающая увеличение заработной платы, которое необходимо применить:

INCREASE_ID РАСТЕНИЕ ДЕПТО ИМЯ ФАКТОР IC1 1 МГ 1.2 IC2 2 СП 1,4 IC3 3 ДФ 1.3 IC4 4 СП БЕТ 1.3 IC5 СП 1.02

Увеличение может применяться кумулятивно и при совпадении одного из ключей. Например, Итан может получить два типа повышения в сочетании:

  • IC2: Потому что ЗАВОД = 2 и ДЕПТО = SP
  • IC5: Потому что ДЕПТО = SP

Имея это в виду, моя цель — получить следующую таблицу, если объединить две вышеуказанные таблицы:

РАСТЕНИЕ ДЕПТО ИМЯ ЦЕНИТЬ LIST_OF_INCREASE_ID FACTOR_COMBINED 1 МГ КЕВИН 1.100 IC1 1,20 2 СП ИТАН 1.200 IC2 и IC5 1,43 (1,4*1,02) 3 МГ ХУАН 1.200 1,00 4 СП БЕТ 1.300 IC4 и IC5 1,33 (1,3*1,02) 5 СП ДЖОН 1.000 IC5 1,02

Есть ли у кого-нибудь какие-либо предложения по методу или типу соединения, который может «избежать» этих нулевых случаев, когда у меня есть совпадение в любом из ключевых столбцов (PLANT, DEPTO или NAME)?

Я думаю, это соединение двумя левыми: первое через PLANT, второе через DEPTO? Для левого соединения даже при отсутствии соответствующего ключа пустые столбцы все равно будут существовать.

Jonathan 21.05.2024 10:19

@Джонатан мог бы быть способом, но основная проблема здесь заключается в том, что мне нужно применить увеличение зарплаты не только на один или два ключевых столбца... Это нужно применить путем комбинации этих ключевых столбцов... в конце концов, иногда я могу сделать это по названию, по дептам или растениям, или их комбинации. Это много возможностей.

Siq_ 21.05.2024 12:45

Я нашел способ создавать объединения «условно», который позволяет «избегать» нулей... Я работаю над этим, чтобы посмотреть, сработает ли он в моем случае: stackoverflow.com/questions/70890880/…

Siq_ 21.05.2024 12:47
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
1
3
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для будущих читателей, у которых возникнет такая же проблема, я смог решить ее, следуя идее условного соединения, описанной в этом посте.

По сути, я создал переменную, в которой хранятся условия, которые заменяют каждое нулевое значение соответствующим значением в таблице фактов, получив следующую таблицу:

# make condition to join increase_df and fact_df

condition = (
   (fn.coalesce(increase_df.PLANT, fact_df.PLANT) == fact_df.PLANT) &
   (fn.coalesce(increase_df.DEPTO, fact_df.DEPTO) == fact_df.DEPTO) &
   (fn.coalesce(increase_df.NAME, fact_df.NAME) == fact_df.NAME)
)

final_df = (
    fact_df
    .join(increase_df, condition, "left")
)

final_df.show()
+-----+-----+-----+------+-----------+-----+-----+----+------+
|PLANT|DEPTO| NAME| VALUE|INCREASE_ID|PLANT|DEPTO|NAME|FACTOR|
+-----+-----+-----+------+-----------+-----+-----+----+------+
|    1|   MG|KEVIN|1100.0|        IC1|    1|   MG|null|   1.2|
|    2|   SP|ETHAN|1200.0|        IC5| null|   SP|null|  1.02|
|    2|   SP|ETHAN|1200.0|        IC2|    2|   SP|null|   1.4|
|    3|   DF| JUAN|1200.0|        IC3|    3|   DF|null|   1.3|
|    4|   SP| BETH|1100.0|        IC5| null|   SP|null|  1.02|
|    4|   SP| BETH|1100.0|        IC4|    4|   SP|BETH|   1.3|
|    5|   SP| JOHN|1000.0|        IC5| null|   SP|null|  1.02|
+-----+-----+-----+------+-----------+-----+-----+----+------+

После этого я просто агрегировал значения:

+-----+-----+-----+------+------+-----------+
|PLANT|DEPTO| NAME| VALUE|FACTOR|INCREASE_ID|
+-----+-----+-----+------+------+-----------+
|    1|   MG|KEVIN|1100.0|   1.2|        IC1|
|    2|   SP|ETHAN|1200.0| 1.428|IC5 and IC2|
|    3|   DF| JUAN|1200.0|   1.3|        IC3|
|    4|   SP| BETH|1100.0| 1.326|IC5 and IC4|
|    5|   SP| JOHN|1000.0|  1.02|        IC5|
+-----+-----+-----+------+------+-----------+

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