Спарк, как объединить два датафрейма по нескольким столбцам? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть два кадра данных

  • столбцы: ['q1', 'q2', 'q3', 'a1', 'a2']
  • b столбцы: ['q1', 'q2', 'q3', 'b', 'b2']

a могут иметь некоторые ['q1', 'q2', 'q3'] не в b,b также может иметь некоторые ['q1', 'q2', 'q3'], не входящие в a.

Слияние означает, что если a имеет ['q1', 'q2', 'q3'] так же, как b, соедините строки, затем объедините левые строки. full outer join такого не делает.

мой код пресудо выглядит следующим образом:

c = a.join(b, on= ['q1', 'q2', 'q3'], how='inner')
c = c.union(a.filter( ~a.withColumn('xxx', F.concat_ws('|', 'q1', 'q2', 'q3') ).isin(c.select(F.concat_ws('|', 'q1', 'q2', 'q3')) )
c = c.union(b.filter( ~b.withColumn('xxx', F.concat_ws('|', 'q1', 'q2', 'q3') ).isin(c.select(F.concat_ws('|', 'q1', 'q2', 'q3')) )

Но это очень неэффективно.

Есть ли лучший способ?

1 Ответ

0 голосов
/ 11 ноября 2019

Я предполагаю, что вы хотите присоединение left-outer, которое может быть достигнуто:

df1.join(df2, on=['q1', 'q2', 'q3'], "left_outer")

enter image description here

...