Условия левого соединения, собранные из нескольких таблиц в Pyspark - PullRequest
1 голос
/ 28 апреля 2020

Моя основная таблица выглядит следующим образом:

enter image description here

Соединение слева на H1:

enter image description here

Если H1 в основной таблице не соответствует значению в правой таблице, добавьте значение из сопоставления 'H2' из таблицы ниже (Таблица3): enter image description here

Final Результат:

enter image description here

Мое текущее решение состоит в том, чтобы вырезать NULLS после первого соединения. Соединение NULLS с таблицей 3 и добавление его обратно в основную таблицу. Однако это утомительно и требует много памяти.

result = Main.join(Table2, Main.H1==Table2.H1, 'left')
Slice = result.filter(result.R.isNull())
Slice = Slice.join(Table3, Slice.H2==Table3.H2, 'left')

finalresult = result.filter(~result.R.isNull()).union(Slice) 

Пожалуйста, сообщите, если есть более эффективный способ реализовать это.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Попробуйте это с помощью left join, затем inner join, а затем используйте when/otherwise для replace null.

from pyspark.sql import functions as F    
Main.join(Table2.withColumnRenamed("H2","H22"), ['H1'],'left').drop("H22")\
    .join(Table3.withColumnRenamed("R","R2"),['H2'])\
    .withColumn("R", F.when(F.col("R").isNull(), F.col("R2")).otherwise(F.col("R"))).drop("R2").show()

#+---+---+---+
#| H2| H1|  R|
#+---+---+---+
#|  B|  3|0.6|
#|  C|  5|0.2|
#|  A|  1|0.5|
#|  A|  2|0.4|
#|  A|  4|0.3|
#+---+---+---+
0 голосов
/ 28 апреля 2020

Во-первых, способ слияния:

result = Main.join(Table2, Main.H1==Table2.H1, 'left')

будет иметь два столбца с именем 'H1', один из главной таблицы, а другой из таблицы 2.

Итак, лучший способ будет слиться так, как сказал Мухаммед. Но его можно еще улучшить, если использовать функцию объединения.

Main.join(Table2.withColumnRenamed("H2","H22"), ['H1'],'left').drop("H22")\
.join(Table3.withColumnRenamed("R","R2"),['H2'])\
.withColumn("R", F.coalesce(F.col("R"), F.col("R2"))).drop("R2").show()

Подробнее см. По этой ссылке - https://www.youtube.com/watch?v=6nZ5KiRuNfc

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