2

讓我們說我有星火2個DataFramesPySpark數據框 - 加入多個列的動態

firstdf = sqlContext.createDataFrame([{'firstdf-id':1,'firstdf-column1':2,'firstdf-column2':3,'firstdf-column3':4}, \ 
{'firstdf-id':2,'firstdf-column1':3,'firstdf-column2':4,'firstdf-column3':5}]) 

seconddf = sqlContext.createDataFrame([{'seconddf-id':1,'seconddf-column1':2,'seconddf-column2':4,'seconddf-column3':5}, \ 
{'seconddf-id':2,'seconddf-column1':6,'seconddf-column2':7,'seconddf-column3':8}]) 

現在我想通過多列加入他們(任何數量的比一個大)

什麼我是第一個DataFrame的一列數組和第二個DataFrame的一列數組,這些數組具有相同的大小,並且我想通過這些數組中指定的列進行連接。例如:

columnsFirstDf = ['firstdf-id', 'firstdf-column1'] 
columnsSecondDf = ['seconddf-id', 'seconddf-column1'] 

由於這些陣列具有可變大小,我不能使用這種方法:

from pyspark.sql.functions import * 

firstdf.join(seconddf, \ 
    (col(columnsFirstDf[0]) == col(columnsSecondDf[0])) & 
    (col(columnsFirstDf[1]) == col(columnsSecondDf[1])), \ 
    'inner' 
) 

有什麼辦法,我可以加入多個列動態?由於您使用的邏輯就足以提供的條件列表沒有&操作

firstdf.join(
    seconddf, 
    [col(f) == col(s) for (f, s) in zip(columnsFirstDf, columnsSecondDf)], 
    "inner" 
) 

+0

爲什麼不使用for循環?您還可以使用itertools庫在您的列表之間執行笛卡爾產品 – GwydionFR

回答

2

爲什麼不使用簡單的理解。