因此,我有以下两个 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 |
+---------+-----------+
4条答案
按热度按时间q43xntqr1#
imo简单的内部连接在这里是可以的,它将过滤来自df1的记录,这些记录的名称在df2中不存在,这是你所期望的
df1.join(df2,d1(“名称”)=== d2(“名称”),“内部”)
在标题中,您询问了有关重复项的问题,重复的记录将在内部连接后保留在那里,如果要删除它们,可以使用distinct
你可以在下面找到内部连接的例子(内部连接是Spark中默认的连接类型,这就是为什么我可以跳过这里的第三个参数)
bn31dyow2#
一个简单的内部连接应该可以解决这个问题。因为你只需要两个DF中匹配的值,内部连接只保留DF之间匹配的键。
uz75evzq3#
不好意思如果弄脏了,写在我手机上。
kr98yfug4#
您需要的是一个LEFT SEMI连接,它实际上相当于执行
SELECT * FROM df1 WHERE df1.Name IS IN df2.Name
-在PySpark代码中,它将如下所示:您可以在PySpark文档中阅读更多信息