簡體   English   中英

pySpark 在多列上加入 dataframe

[英]pySpark join dataframe on multiple columns

我正在使用下面的代碼在兩個數據幀之間加入和刪除重復項。 但是,得到錯誤AnalysisException: Detected implicit cartesian product for LEFT OUTER join between logical plans...Either: use the CROSS JOIN syntax to allow cartesian products between these relations, or: enable implicit cartesian products by setting the configuration variable 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列表嗎? 我需要避免硬編碼名稱,因為 cols 會因大小寫而異。

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM