当前位置: 首页 > 知识库问答 >
问题:

Spark连接列表中有2个不同列名的2个数据框

章宏峻
2023-03-14

有没有办法通过两个列表< code>join两个< code > Spark data frame 具有不同的列名?

我知道如果他们在列表中有相同的名字,我可以做以下事情:

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的连接,因此我想知道Scala Spark是否有办法做到这一点?

页(page的缩写)我在寻找类似python的东西< code >熊猫合并:

joindf = pd.merge(df1, df2, left_on = list1, right_on = list2, how = 'left')

共有2个答案

越景天
2023-03-14

如果您需要两个字符串列表:

val leftOn = Seq("col_a", "col_b")
val rightOn = Seq("col_x", "coly")

只需压缩并减少:

import org.apache.spark.sql.functions.col

val on = leftOn.zip(rightOn)
  .map { case (x, y) => df1(x) <=> df2(y) }
  .reduce(_ and _)

df1.join(df2, on, "left")
居乐池
2023-03-14

您可以自己轻松定义这样的方法:

 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")
 类似资料:
  • 我有三张桌子: 我想从表1中选择COL1,从表2中选择COL5,从表3中选择COL4 它喜欢两个联接表,但是当我使用以下查询时,它不起作用,COL5是空白的。 请帮忙。 PS我复制了之前的一个类似示例,但输出不同。

  • 问题内容: 我需要比较2个不同数据库中的数据库表,以了解差异所在,是否有一个简单的工具或脚本来实现? 问题答案: redgate SQL数据比较

  • 问题内容: 我的MySQL数据库中有这些表: 通用表: Facebook表: 首席表: 基本上,常规表包含一些( 显然 )常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。 我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。 所以,我想这

  • 我试图用SPARK SQL编写一个查询,执行三个表的联接。但是查询输出实际上是。它适用于单人餐桌。我的联接查询是正确的,因为我已经在oracle数据库中执行了它。我需要在这里附加什么更正?Spark版本是2.0.0。 我在一些网页上发现了下面的说明,但它仍然不起作用:

  • 我正在运行以下JOOQ查询: table和joinTable都有id作为主键名称,但最终获取实体类包含joinTable的id和table的其余列。如果我重新排序表,结果相似,我有表的ID和joinTable的其余列。

  • 我有两个列表和,它们都有元素。 我希望以这样一种方式组合这些元素,即相同索引上的元素聚集在一起,形成以分隔的: 是否有任何方法可以使用Java8直接从2列表本身获得结果列表或字符串 我可以通过使用地图而不是列表来实现这一点。