在Pyspark中完全阻止加入

时间:2019-07-08 22:36:47

标签: pyspark pyspark-sql

我正在尝试使用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 :(得分:0)

它将起作用。请在下面找到。

>>> 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|
+-----+-----+