Python pySpark在多列上连接数据帧

Python pySpark在多列上连接数据帧,python,dataframe,join,pyspark,multiple-columns,Python,Dataframe,Join,Pyspark,Multiple Columns,我使用下面的代码在两个数据帧之间连接和删除复制的数据。 但是,get errorAnalysisException:检测到逻辑计划之间左外连接的隐式笛卡尔积…或者:使用交叉连接语法允许这些计划之间的笛卡尔积 关系,或:通过设置配置启用隐式笛卡尔积 变量spark.sql.crossJoin.enabled=true 我的df1有15列,我的df2有50多列。如何在不硬编码要连接的列的情况下连接多个列 def join(dataset_standardFalse, dataset, how='l

我使用下面的代码在两个数据帧之间连接和删除复制的数据。 但是,get error
AnalysisException:检测到逻辑计划之间左外连接的隐式笛卡尔积…或者:使用交叉连接语法允许这些计划之间的笛卡尔积
关系,或:通过设置配置启用隐式笛卡尔积
变量spark.sql.crossJoin.enabled=true

我的df1有15列,我的df2有50多列。如何在不硬编码要连接的列的情况下连接多个列

def join(dataset_standardFalse, dataset,  how='left'):
    final_df = dataset_standardFalse.join(dataset,  how=how)
    repeated_columns = [c for c in dataset_standardFalse.columns if c in dataset.columns]
    for col in repeated_columns:
        final_df = final_df.drop(dataset[col])
    return final_df

例如,在比较数据帧的列时,它们将有多个公共列。我可以加入
cols
列表吗?我需要避免硬编码名称,因为COL会因情况而异

cols = set(dataset_standardFalse.columns) & (set(dataset.columns))
print(cols)


IIUC如果两个数据帧中都存在多个列,则可以直接连接多个列

#This gives you the common columns list from both the dataframes
cols = list(set(dataset_standardFalse.columns) & (set(dataset.columns)))

#Modify your function to specify list of columns for join condition
def join(dataset_standardFalse, dataset,  how='left'):
    cols = list(set(dataset_standardFalse.columns) & (set(dataset.columns)))
    final_df = dataset_standardFalse.join(dataset, cols, how=how)
    repeated_columns = [c for c in dataset_standardFalse.columns if c in dataset.columns]
    for col in repeated_columns:
        final_df = final_df.drop(dataset[col])
    return final_df
当您在联接条件中传递列列表时,两个数据帧中都应该存在列。如果该列不存在,则应在预处理步骤中重命名该列或动态创建联接条件

对于动态列名,请使用以下命令:

#Identify the column names from both df
df = df1.join(df2,[col(c1) == col(c2) for c1, c2 in zip(columnDf1, columnDf2)],how='left')

您想在哪些列上加入数据帧?看看这个spark jira。可能是helpful@ShubhamJain,我在我的问题中添加了一个特定的案例。对于连接,我无法显示我的
final_df
。使用
显示(final_-df)
时,我得到
名称错误:未定义名称“final_-df”
。因此,我最终删除了函数方面,simpy将其用作列表理解。对于动态列名,如何定义
columnDf1
,是否需要硬编码列名?我正在尝试你的两个建议,看看哪一个更适合我的情况。@Shubham JainIn如果你的连接列名不同,那么你必须以某种方式映射df1和df2的列,因此硬编码,或者如果列名中有任何关系,那么它可以是动态的。qq,我使用的是code
final\u df=dataset\u standardflse.join(数据集_comb2,cols_comb3,how='left')
加入dfs,它实际上会删除重复的列。现在,我注意到,在某些情况下,我的数据帧在理论上会有4个或更多的“重复列名”。但是行到行的值不会重复。现在,我的代码只考虑重复的列,所以所有重复的列都会被删除,而不会考虑到重复的列。…但重复列中有唯一的行。有没有办法调整它?@Shubham Jain没有办法,在删除列之前,比较两列的所有值是否相同删除额外的列,否则保留它或将其重命名为新名称是的,我想我可以使用/a
union
然后删除?@Shubham Jain