Pyspark数据框以很少的重复列名和很少没有重复的列联接

时间:2019-12-03 09:37:38

标签: python dataframe pyspark

我需要在我的项目中实现pyspark数据框联接。

我需要参加3种不同的情况。

1) 如果两个数据框都具有相同的名称,请连接列。我加入如下。它消除了重复的列col1, col2

cond = ['col1', 'col2']

df1.join(df2, cond, "inner")

2)如果两个数据框都具有不同的名称联接列。我加入如下。它将按预期维护所有4个连接列。

cond = [df1.col_x == df2.col_y,
        df1.col_a == df2.col_b]

df1.join(df2, cond, "inner")

3)如果数据框具有几个相同的名称联接列和几个不同的名称联接列。我尝试如下。但是,它失败了。

cond = [df1.col_x == df2.col_y,
        df1.col_a == df2.col_b,
        'col1',
        'col2',
        'col3']

df1.join(df2, cond, "inner")

我尝试如下工作。

cond = [df1.col_x == df2.col_y,
        df1.col_a == df2.col_b,
        df1.col1 == df2.col1,
        df1.col2 == df2.col2,
        df1.col3 == df2.col3]

df1.join(df2, cond, "inner")

但是col1, col2, col3有重复的列。我想在加入自己时消除这些重复的列,而不是稍后再drop个列。

请建议如何实现#3或建议其他方法。

1 个答案:

答案 0 :(得分:0)

没有办法:在幕后执行等值联接(colA == colB),其中条件以(一个或多个)字符串(称为自然联接)的形式给出就像是常规的等联接(source)一样

frame1.join(frame2, 
            "shared_column",
            "inner")

获取翻译为

frame1.join(frame2,
            frame1.shared_column == frame2.shared_column, 
            "inner")

此后,重复项将被丢弃(投影)。

如果您有一个条件使用了既可以是自然联接又可以是常规均等联接的两个键,则可以在之后删除重复的列,或者重命名在联接之前没有同名的键。

>