Полная блокировка присоединиться в Pyspark - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь использовать pyspark для дедупликации базы данных, и как часть конвейера я хочу создать фрейм данных из двух идентичных левого и правого фреймов данных. У них есть общий индекс.

Первоначально я был ленив и просто использовал CROSS JOIN, но это приводит к дублированию объединений (слева направо - то же, что справа налево). Но теперь мне нужно немного оптимизировать код, и я задаюсь вопросом, как лучше всего достичь такого типа соединения. Кто-нибудь может предложить что-нибудь?

l_df = spark.createDataFrame([('A',), ('B',), ('C',), ('D',)], ['l_idx'])
r_df = spark.createDataFrame([('A',), ('B',), ('C',), ('D',)], ['r_idx'])

l_df.createOrReplaceTempView('l_df')
r_df.createOrReplaceTempView('r_df')

block_df = spark.sql('''
SELECT *
FROM l_df
CROSS JOIN r_df
''')

block_df.show()

В результате получаются все комбинации.

Однако я ищу ..

A B
A C
A D
B C
B D
C D

только

Спасибо, JXC! Решено с вашим предложением!

1 Ответ

0 голосов
/ 09 июля 2019

Это будет работать. Пожалуйста, найдите ниже.

>>> bdf = spark.sql("select * from l_df CROSS JOIN r_df WHERE l_df.l_idx < r_df.r_idx")

>>> bdf.show()


+-----+-----+
|l_idx|r_idx|
+-----+-----+
|    A|    B|
|    A|    C|
|    A|    D|
|    B|    C|
|    B|    D|
|    C|    D|
+-----+-----+
...