【问题标题】:Full blocking join in PysparkPyspark 中的完全阻塞连接
【发布时间】: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


【解决方案1】:

它会起作用的。请在下面找到。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2020-03-17
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多