PySpark DataFrame - 动态加入多个列

时间:2016-09-21 02:29:55

标签: python apache-spark dataframe pyspark apache-spark-sql

让我们说我在Spark上有两个DataFrame

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

有没有办法可以动态加入多个列?

2 个答案:

答案 0 :(得分:5)

为什么不使用简单的理解:

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

由于您使用逻辑,因此只需提供没有&运算符的条件列表。

答案 1 :(得分:0)

@Mohan 抱歉,我没有信誉可做“添加评论”。在两个数据框上具有相同的列,使用这些列创建列表并在联接中使用

col_list=["id","column1","column2"]
firstdf.join( seconddf, col_list, "inner")