Условное объединение на разных столбцах - PullRequest
0 голосов
/ 02 ноября 2018

Какой самый эффективный способ написать это в pyspark:

Псевдокод:

table1 inner join table2 
on cookies if table1.cookie is not Null 
else join on ids

table1:

id, cookie
1, 1q2w
2, Null

table2:

id, cookie
1, 1q2w
2, 3e4r

Ответы [ 5 ]

0 голосов
/ 02 ноября 2018

На стороне pyspark вы можете создать два df в зависимости от того, будет ли table1.cookie нулевым или нет, затем объединить их

>>> import pyspark.sql.functions as F
>>> df1 = table1.where(F.isnull('cookie')==True).join(table2, table1.id == table2.id, 'inner').select(table1.id,table2.cookie)
>>> df2 = table1.where(F.isnull('cookie')==False).join(table2, table1.cookie == table2.cookie, 'inner').select(table1.id,table2.cookie)
>>> df1.union(df2).show()
+---+------+                                                                    
| id|cookie|
+---+------+
|  2|  3e4r|
|  1|  1q2w|
+---+------+
0 голосов
/ 02 ноября 2018

Наиболее эффективным способом часто является использование left join s:

select . . .,
       coalesce(t2c.colx, t2i.colx) as colx
from table1 t1 inner join
     table2 t2c
     on t1.cookie = t2.cookie left join
     table2 t2i
     on t1.id = t2i.id and t2c.cookie is null
0 голосов
/ 02 ноября 2018

Присоединиться к файлам cookie или для идентификаторов, когда table1.cookie имеет значение null:

select *
from table1 t1
join table2 t2 on t1.cookie = t2.cookie
               or (t1.cookie is null and t1.id = t2.id)
0 голосов
/ 02 ноября 2018

Вы можете использовать OR как в ответах, представленных на данный момент. Однако, по моему опыту, соединения с or работают очень плохо. Вы также можете использовать UNION|UNION ALL:

select * 
from table1 
inner join table2 
on table1.cookies= table2.cookies

UNION (ALL) -- UNION removes duplicates, UNION ALL keeps them.

select * 
from table1 
inner join table2 
on table1.id=table2.id
0 голосов
/ 02 ноября 2018

Вы можете попробовать использовать ИЛИ

DEMO

select * from 
table1 inner join table2 
on table1.cookies= table2.cookies or table1.id=table2.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...