scala - 列表中有 2 个不同列名的 2 个数据帧的 Spark Join

标签 scala apache-spark join

有没有办法通过 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/

相关文章:

Scala:上限 [T <: AnyRef] 不允许返回 [AnyRef]

scala - 用于提前退出循环的功能代码

scala - 从映射中获取列值的值作为 spark 数据帧中的键

hadoop - 我可以将 Hadoop 与 AWS4-HMAC-SHA256 一起使用吗?

mysql - 查询多张表,但只得到一张表的结果,不重复

javascript - 删除 scala.js 中的事件监听器

scala - Flatten 的两种变体的渐近时间差异

apache-spark - 无法在 EMR 5.0 HUE 上实例化 SparkSession

Postgresql Query相当于Excel的VLookUp

android - 谷歌播放测试版 : 'App not available for this account' message