如何使用单独的键列表在两个 DataFrame 之间执行连接?

Posted

技术标签:

【中文标题】如何使用单独的键列表在两个 DataFrame 之间执行连接?【英文标题】:How to use separate key lists to perform a join between two DataFrames? 【发布时间】:2022-01-14 13:26:21 【问题描述】:

我想加入两个不同的 DataFrame(dfAdfB),构建如下:

dfA.show()
+-----+-------+-------+
| id_A| name_A|address|
+-----+-------+-------+
|    1|   AAAA|  Paris|
|    4|   DDDD| Sydney|
+-----+-------+-------+

dfB.show()
+-----+-------+---------+
| id_B| name_B|      job|
+-----+-------+---------+
|    1|   AAAA|  Analyst|
|    2|   AERF| Engineer|
|    3|   UOPY| Gardener|
|    4|   DDDD|  Insurer|
+-----+-------+---------+

我需要使用以下列表来进行连接:

val keyListA = List("id_A", "name_A")
val keyListB = List("id_B", "name_B")

一个简单的解决方案是:

val join = dfA.join(
  dfA("id_A") === dfB("id_B") &&
  dfA("name_A") === dfB("name_B"),
"left_outer")

是否有一种语法允许您通过使用 keyListAkeyListB 列表来执行此连接?

【问题讨论】:

【参考方案1】:

如果您真的想从列名列表构建连接表达式:

import org.apache.spark.sql.Column, DataFrame
import org.apache.spark.sql.functions._

val dfA: DataFrame = ???
val dfB: DataFrame = ???

val keyListA = List("id_A", "name_A", "property1_A", "property2_A", "property3_A")
val keyListB = List("id_B", "name_B", "property1_B", "property2_B", "property3_B")


def joinExprsFrom(keyListA: List[String], keyListB: List[String]): Column = 
  keyListA
    .zip(keyListB)
    .map  case (fromA, fromB) => col(fromA) === col(fromB) 
    .reduce((acc, expr) => acc && expr )

dfA.join(
  dfB,
  joinExprsFrom(keyListA, keyListB),
  "left_outer")

您需要确保keyListAkeyListB 大小相同且非空。

【讨论】:

以上是关于如何使用单独的键列表在两个 DataFrame 之间执行连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何与熊猫数据框中的键和键列表合并

如何根据字典中的键/值增加 Python Pandas DataFrame

使用三个单独的键连接两个数据帧

如何使用 OCaml 将两个列表中的每个单独元素压缩到一个列表中

DataFrame行列表查询操作详解+代码实战

如何使用 pandas DataFrame 计算列表的字典?