Pyspark SparkSQL:外部联接问题



我正在使用pyspark,并且我在外部联接方面遇到了这个问题。基本上,如果我使用列名列表作为"ON"条件,那么无论我是否指定了"outer_left"选项,联接的结果都是内部联接。如果不是列名称列表,而是指定完全相等(即df1.id=df2.id),那么问题就会消失

换句话说:

testDf = sc.parallelize([['a', 1], ['b', 1]]).toDF(['id', 'val1'])
testDf2 = sc.parallelize([['a', 2]]).toDF(['id', 'val2'])
cond = [testDf.id == testDf2.id]
testDf.join(testDf2, cond, how='left_outer').collect()

将返回左右外部联接:

[Row(id=u'a', val1=1, id=u'a', val2=2),Row(id=u'b', val1=1, id=None, val2=None)]

但是如果我使用

testDf.join(testDf2, 'id', how='left_outer').collect()

它将返回一个内部加入

[Row(id=u'a', val1=1, val2=2)]

你能帮我理解为什么吗?非常感谢!

正如官方文档中所述:

如果on是指示联接列名称的字符串或字符串列表,则

列必须存在于两侧,这将执行内部等联接