如何使用单独的键列表在两个 DataFrame 之间执行连接?
Posted
技术标签:
【中文标题】如何使用单独的键列表在两个 DataFrame 之间执行连接?【英文标题】:How to use separate key lists to perform a join between two DataFrames? 【发布时间】:2022-01-14 13:26:21 【问题描述】:我想加入两个不同的 DataFrame(dfA
和 dfB
),构建如下:
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")
是否有一种语法允许您通过使用 keyListA
和 keyListB
列表来执行此连接?
【问题讨论】:
【参考方案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")
您需要确保keyListA
和keyListB
大小相同且非空。
【讨论】:
以上是关于如何使用单独的键列表在两个 DataFrame 之间执行连接?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据字典中的键/值增加 Python Pandas DataFrame