在以下示例中,pyspark内部联接是否会在第一个数据集中保留重复项?

cetgtptt  于 2022-11-16  发布在  Apache
关注(0)|答案(4)|浏览(207)

因此,我有以下两个 Dataframe :
DF1如下所示:

+---------+-----------+
|  Name   |   Money   |
+---------+-----------+
|    A    |   50.3    |
|    B    |   26.9    |
|    C    |   11.4    |
|    A    |   35.8    |
|    B    |   59.2    |
|    A    |   90.8    |
|    C    |   23.5    |
|    D    |   23.5    |
|    D    |   54.6    |
|    E    |   78.0    |
|    A    |   12.3    | 
|    F    |   20.3    |
|    A    |   57.1    | 
+---------+-----------+

DF2如下所示(唯一名称列表):

+---------+
|  Name   |
+---------+
|    A    |
|    C    |
|    D    |
+---------+

什么类型的联接会给予以下结果(仅保留DF2中出现的A、C和D):

+---------+-----------+
|  Name   |   Money   |
+---------+-----------+
|    A    |   50.3    |
|    C    |   11.4    |
|    A    |   35.8    |
|    A    |   90.8    |
|    C    |   23.5    |
|    D    |   23.5    |
|    D    |   54.6    |
|    A    |   12.3    | 
|    A    |   57.1    | 
+---------+-----------+
q43xntqr

q43xntqr1#

imo简单的内部连接在这里是可以的,它将过滤来自df1的记录,这些记录的名称在df2中不存在,这是你所期望的
df1.join(df2,d1(“名称”)=== d2(“名称”),“内部”)
在标题中,您询问了有关重复项的问题,重复的记录将在内部连接后保留在那里,如果要删除它们,可以使用distinct
你可以在下面找到内部连接的例子(内部连接是Spark中默认的连接类型,这就是为什么我可以跳过这里的第三个参数)

bn31dyow

bn31dyow2#

一个简单的内部连接应该可以解决这个问题。因为你只需要两个DF中匹配的值,内部连接只保留DF之间匹配的键。

df = df1.alias("t0").join(
        df2.alias("t1"),
        on=f.col("t0.Name") == f.col("t1.Name"),
        how='inner'
    ).select(
        f.col("t0.Name"),
        f.col("t0.Money")
    )
uz75evzq

uz75evzq3#

Select * from df1 
where df1.name in (
  Select name from df2)

不好意思如果弄脏了,写在我手机上。

kr98yfug

kr98yfug4#

您需要的是一个LEFT SEMI连接,它实际上相当于执行SELECT * FROM df1 WHERE df1.Name IS IN df2.Name-在PySpark代码中,它将如下所示:

df1 = spark.createDataFrame([("A", 50.3), ("B", 26.9), ("C", 11.4), ("A", 35.8), ("B", 59.2), ("A", 90.8), ("C", 23.5), ("D", 23.5), ("D", 54.6), ("E", 78.0), ("A", 12.3), ("F", 20.3), ("A", 57.1)], "Name: string, Money: double")
df2 = spark.createDataFrame([("A",), ("C",), ("D",)], "Name: string")

df1.join(df2, "Name", how="left_semi").show()
+----+-----+
|Name|Money|
+----+-----+
|   A| 50.3|
|   A| 35.8|
|   A| 90.8|
|   A| 12.3|
|   A| 57.1|
|   C| 11.4|
|   C| 23.5|
|   D| 23.5|
|   D| 54.6|
+----+-----+

您可以在PySpark文档中阅读更多信息

相关问题