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

Posted

技术标签:

【中文标题】使用三个单独的键连接两个数据帧【英文标题】:Join two dataframes using three seperate keys 【发布时间】:2021-11-17 13:28:22 【问题描述】:
import pyspark.sql.functions as F

data1 = [("10/05/21", 1, "White", 3000), ("10/06/21", 2, "Blue", 4100), ("10/07/21", 3, "Green", 6200)]
df1 = spark.createDataFrame(data1, ["START", "KEY1", "Color", "OTHER"])

data2 = [(1, 2, 3, 3000), (2, 3, 2, 4100), (3, 1, 2, 6200)]
df2 = spark.createDataFrame(data2, ["KEY2", "KEY3", "KEY4", "NUMBER"])

df_result = df1.withColumnRenamed("START", "DATE1").join(
    df2,
    F.col("KEY1") == F.col("KEY2")
).select("DATE1", "KEY3", "KEY4").join(
    df1.withColumnRenamed("START", "DATE2"),
    F.col("KEY1") == F.col("KEY3")
).select("DATE1", "DATE2", "KEY4").join(
    df1.withColumnRenamed("START", "DATE3"),
    F.col("KEY1") == F.col("KEY4")
).select("DATE1", "DATE2", "DATE3")

df_result.show()

我正在尝试使用找到 here 的方法,但似乎无法加入它,因为说无法解决 key4

【问题讨论】:

【参考方案1】:

您在第一次加入后没有选择KEY4,导致加入后select 不可用,条件为KEY1 = KEY3

df_result = df1.withColumnRenamed("START", "DATE1").join(
    df2,
    F.col("KEY1") == F.col("KEY2")
).select("DATE1", "KEY3", "KEY4").join(
    df1.withColumnRenamed("START", "DATE2"),
    F.col("KEY1") == F.col("KEY3")
).select("DATE1", "DATE2", "KEY4").join(
    df1.withColumnRenamed("START", "DATE3"),
    F.col("KEY1") == F.col("KEY4")
).select("DATE1", "DATE2", "DATE3")

输出

+--------+--------+--------+
|   DATE1|   DATE2|   DATE3|
+--------+--------+--------+
|10/05/21|10/06/21|10/07/21|
|10/07/21|10/05/21|10/06/21|
|10/06/21|10/07/21|10/06/21|
+--------+--------+--------+

【讨论】:

以上是关于使用三个单独的键连接两个数据帧的主要内容,如果未能解决你的问题,请参考以下文章

两个数据帧的完全外连接

如何在不合并索引的情况下连接具有不同多索引的两个数据帧?

连接单独处理的火花数据帧的两列时的顺序保证是啥?

使用完全外连接合并两个数据帧在两个数据帧上没有获得关键列

在 Spark 中连接两个数据帧

将 Pandas 数据帧与多索引列和不规则时间戳连接起来