将两个数据帧与一个数据帧的单独键结合起来,这样 select 可以基于键的两列

Combine two dataframes with seperate keys for one dataframe so can select two column based on keys

我希望新列 DATE1 等于 KEY1 上数据帧 1(DF1) 中的列 START,并与基于 DF2 中 KEY2 的数据帧 2 (DF2) 结合所以它显示 DATE1 只是在连接中出现密钥时。我可以显示列开始但它显示所有。

我希望 KEY1 上的数据帧 1(DF1) 中的 DATE2 等于列 START,但基于 DF2 中名为 KEY3 的不同键与 DF2 结合,因此它显示 DATE2 就在连接中的键匹配时。我可以显示列开始,但不确定如何仅在结合两个键时显示列开始。

DF1 的示例输入为:

+---------+--------+------+------+
|START    |KEY1    |Color  OTHER |
+---------+--------+------+------+
| 10/05/21|  1     | White|  3000|
| 10/06/21|  2     |  Blue|  4100|
| 10/07/21|  3     | Green|  6200|
+---------+--------+------+------+

DF2 输入为:

+---------+--------+----+
|KEY2     |KEY3 |NUMBER|
+---------+--------+----+
|  1     |     2|  3000 |
|  2     |     3|  4100 |
|  3     |     1|  6200 |
+---------+--------+----+

输出如下所示:

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

代码如下

def transform_df_data(df: DataFrame):
        return \
            df \
                .withColumn("DATE1", col("START")) \
                .withColumn("DATE2", col("START")) \
                .withColumn("KEY1", col("KEY1")) \
                .select("KEY1","DATE1","DATE2")
    
    def build_final_df(df:DataFrame, otherdf:Dataframe)
         df_transform = transform_df_data(d_period)
         return final_transform.join(df_transform , final_transform.KEY1 == df_transform(KEY2, 'inner').withColumn("DATE1", col("START")).select("DATE1","DATE2")

请注意,我确实正确理解了这个问题,但我想你想在 KEY1 = KEY2 上加入 df1df2,然后在 [上用 df1 再次加入结果=15=]:

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, 3000), (2, 3, 4100), (3, 1, 6200)]
df2 = spark.createDataFrame(data2, ["KEY2", "KEY3", "NUMBER"])

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

df_result.show()

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