有没有办法通过 2 个列表加入
两个具有不同列名的 Spark Dataframes
?
我知道,如果他们在列表中有相同的名字,我可以执行以下操作:
val joindf = df1.join(df2, Seq("col_a", "col_b"), "left")
或者如果我知道不同的列名,我可以这样做:
df1.join(
df2,
df1("col_a") <=> df2("col_x")
&& df1("col_b") <=> df2("col_y"),
"left"
)
由于我的方法需要 2 个列表的输入,这些列表指定哪些列用于每个 DF 的 join
,我想知道 Scala Spark 是否有办法做到这一点?
附言
我正在寻找类似 python pandas merge
的东西:
joindf = pd.merge(df1, df2, left_on = list1, right_on = list2, how = 'left')
最佳答案
您可以轻松地自己定义这样一个方法:
def merge(left: DataFrame, right: DataFrame, left_on: Seq[String], right_on: Seq[String], how: String) = {
import org.apache.spark.sql.functions.lit
val joinExpr = left_on.zip(right_on).foldLeft(lit(true)) { case (acc, (lkey, rkey)) => acc and (left(lkey) === right(rkey)) }
left.join(right, joinExpr, how)
}
val df1 = Seq((1, "a")).toDF("id1", "n1")
val df2 = Seq((1, "a")).toDF("id2", "n2")
val joindf = merge(df1, df2, left_on = Seq("id1", "n1"), right_on = Seq("id2", "n2"), how = "left")
关于scala - 列表中有 2 个不同列名的 2 个数据帧的 Spark Join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50220609/