可以通过select
表达式为Seq[Column]
到方法:
def joinDF(df1: DataFrame, df2: DataFrame , joinExpr: Column, joinType: String, selectExpr: Seq[Column]): DataFrame = {
val dfJoinResult = df1.join(df2, joinExpr, joinType)
dfJoinResult.select(selectExpr:_*)
}
要调用该方法,请使用:
val joinExpr = df1.col("id") === df2.col("id")
val selectExpr = Seq(df1.col("type"), df1.col("account"), df2.col("value"))
val testDf = joinDF(df1, df2, joinExpr, "inner", selectExpr)
这将给出所需的结果:
+------+-------+-----+
| type|account|value|
+------+-------+-----+
| new|current| 7|
|closed| saving| 5|
+------+-------+-----+
In the selectExpr
上面,有必要指定列来自哪个数据帧。然而,这可以是如果以下假设成立,则进一步简化:
- 列到
join
在两个数据框中具有相同的名称
- 要选择的列具有唯一的名称(其他数据框没有同名的列)
在这种情况下,joinExpr: Column
可以改为joinExpr: Seq[String]
and selectExpr: Seq[Column]
to selectExpr: Seq[String]
:
def joinDF(df1: DataFrame, df2: DataFrame , joinExpr: Seq[String], joinType: String, selectExpr: Seq[String]): DataFrame = {
val dfJoinResult = df1.join(df2, joinExpr, joinType)
dfJoinResult.select(selectExpr.head, selectExpr.tail:_*)
}
现在调用该方法看起来更干净:
val joinExpr = Seq("id")
val selectExpr = Seq("type", "account", "value")
val testDf = joinDF(df1, df2, joinExpr, "inner", selectExpr)
Note: 当。。。的时候join
是使用执行Seq[String]
与使用表达式相比,生成的数据帧的列名称将有所不同。当存在同名列时,之后将无法单独选择这些列。