为什么 Pyspark 中带或不带连接条件的交叉连接计数不同?

问题描述 投票:0回答:1
dfj3 = spark.createDataFrame(
    ['a','b','b'],StringType()
    )

dfj4 = spark.createDataFrame(
    ['c','d','e'],StringType()
)

dfj3.join(dfj4).count() // #crossjoin, count = 9
dfj3.join(dfj4,dfj3.value==dfj4.value).count() #innerjoin, count = 0
dfj3.join(dfj4,dfj3.value==dfj4.value,'cross').count() #crossjoin with condition, count = 0

为什么第一个和第三个交叉连接的工作方式不同?

预期有连接条件的交叉连接和无连接条件的交叉连接应该相同,因为将对两个表中的所有记录执行连接。

sql apache-spark pyspark apache-spark-sql cross-join
1个回答
0
投票

所有联接都是数学构造的子集,称为 笛卡尔积 - SQL 术语中的交叉联接。

因此,当您在交叉连接上应用相等条件时 - 它的行为就像一个 equi join(一类内连接),因此结果是不同的。 加入维基百科页面也提到了这一点:

CROSS JOIN 本身不应用任何谓词来过滤连接表中的行。可以使用 WHERE 子句过滤 CROSS JOIN 的结果,然后这可能会产生内部联接的等效结果。

© www.soinside.com 2019 - 2024. All rights reserved.