连接两个 PySpark 数据帧而不重复行

问题描述 投票:0回答:2

我有以下两个 PySpark 数据框:

df1:

第1栏 第2栏 第3栏 第4栏
有一定价值 有一定价值 有一定价值 一些价值1

df2:

第1栏 第2栏 第3栏 第5栏
有一定价值 有一定价值 有一定价值 一些价值2

当我尝试在

column1
column2
column3
上对它们执行外连接时,我得到:

第1栏 第2栏 第3栏 第4栏 第5栏
有一定价值 有一定价值 有一定价值 一些价值2
有一定价值 有一定价值 有一定价值 一些价值1

但我想要以下输出:

第1栏 第2栏 第3栏 第4栏 第5栏
有一定的价值 有一定的价值 有一定价值 一些价值1 一些价值2

我该怎么做?

apache-spark pyspark apache-spark-sql outer-join
2个回答
0
投票

您正在寻找的是

left
而不是
full_outer
加入。

以下代码应该可以达到您的预期结果。

from pyspark.sql import Row
from pyspark.sql import functions as f
from pyspark.sql.types import StructType, StructField, StringType

data_df1 = [
    Row(
        column1="some value",
        column2="some value",
        column3="some value",
        column4="some value1"
    ),
]

schema_df1 = StructType([
    StructField(name="column1", dataType=StringType(), nullable=True),
    StructField(name="column2", dataType=StringType(), nullable=True),
    StructField(name="column3", dataType=StringType(), nullable=True),
    StructField(name="column4", dataType=StringType(), nullable=True),
])

data_df2 = [
    Row(
        column1="some value",
        column2="some value",
        column3="some value",
        column5="some value2"
    ),
]

schema_df2 = StructType([
    StructField(name="column1", dataType=StringType(), nullable=True),
    StructField(name="column2", dataType=StringType(), nullable=True),
    StructField(name="column3", dataType=StringType(), nullable=True),
    StructField(name="column5", dataType=StringType(), nullable=True),
])

df1 = spark.createDataFrame(data=data_df1, schema=schema_df1)
df2 = spark.createDataFrame(data=data_df2, schema=schema_df2)

df_res = df1.join(df2, on=["column1", "column2", "column3"], how="left")

df_res.show()

+----------+----------+----------+-----------+-----------+
|   column1|   column2|   column3|    column4|    column5|
+----------+----------+----------+-----------+-----------+
|some value|some value|some value|some value1|some value2|
+----------+----------+----------+-----------+-----------+

0
投票

由于您还没有共享您的代码 - 所以不确定您做错了什么 - 因为我通过以下代码获得了您想要的输出:

joined_df = df1.join(df2, ["column1", "column2", "column3"], how="outer")
joined_df.show()

输出:

+----------+----------+----------+-----------+-----------+
|   column1|   column2|   column3|    column4|    column5|
+----------+----------+----------+-----------+-----------+
|some value|some value|some value|some value1|some value2|
+----------+----------+----------+-----------+-----------+
© www.soinside.com 2019 - 2024. All rights reserved.