【发布时间】:2019-07-09 20:41:52
【问题描述】:
我正在尝试使用 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! 解决了你的建议!
【问题讨论】:
-
添加 WHERE 子句:
SELECT * FROM l_df CROSS JOIN r_df WHERE l_df.l_idx < r_df.r_idx -
谢谢,这是个好主意,但它给了我错误...无法从 r_idx#63 中提取值:需要结构类型但得到字符串;第 7 行 25 号位
-
你能发布错误信息吗?顺便提一句。您需要在代码中包含 SQL:
block_df = spark.sql('''.......''')
标签: pyspark pyspark-sql