2017-05-09 98 views
0

我把两个dataframes,这是非常相似,这里给出Joining two DataFrames in Spark SQL and selecting columns of only one如何在Scala中连接两个数据框并根据其索引从数据框中选择几列?

不过,我想从df2只选择第二列中的任务。在我的任务中,我将使用reduce函数中的两个数据框的连接函数来获取数据框列表。在这个数据框列表中,列名将是不同的。但是,在每种情况下,我都想保留第二列df2

我没有找到任何地方如何通过其编号索引来选择数据框的列。任何帮助表示赞赏!

编辑:

ANSWER

我想出了解决方案。下面是做到这一点的一种方法:

def joinDFs(df1: DataFrame, df2: DataFrame): DataFrame = { 
    val df2cols = df2.columns 
    val desiredDf2Col = df2cols(1) // the second column 
    val df3 = df1.as("df1").join(df2.as("df2"), $"df1.time" === $"df2.time") 
     .select($"df1.*",$"df2.$desiredDf2Col") 
    df3 
} 

,然后我可以dataframes名单上的reduce操作应用此功能。

var listOfDFs: List[DataFrame] = List() 
// Populate listOfDFs as you want here 
val joinedDF = listOfDFs.reduceLeft((x, y) => {joinDFs(x, y)}) 
+0

大胆注意您可以让您的数据帧的ANL例子吗? – Psidom

+0

@Psidom:我想出了一个解决方案。请参阅编辑。 – inferno

回答

1

要选择你的数据框,你可以在第二栏简单地做:

val df3 = df2.select(df2.columns(1)) 

这将首先查找第二列名称,然后选择它。

0

如果你想在reduce功能来定义joinselect方法类似于Joining two DataFrames in Spark SQL and selecting columns of only one
那么你应该做到以下几点:

import org.apache.spark.sql.functions._ 
d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id").select(Seq(1) map d2.columns map col: _*) 

你必须记住的是,第二列的名称即Seq(1)不应与任何数据框列名相同。
您可以选择多列,以及,但记得上面

import org.apache.spark.sql.functions._ 
d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id").select(Seq(1, 2) map d2.columns map col: _*) 
相关问题