如何根据不同数据帧的列值从pyspark数据帧中过滤掉行

How to filter out rows from pyspark dataframe based on values of columns of different dataframe

我有一个 PySpark 数据框 df1-

data1 = [(("u1", 'w1', 20)), (("u2", 'w1', 30)), (("u3", 'w2', 40))]
df1 = spark.createDataFrame(data, ["ID", "week", "var"])
df1.show()

+---+----+---+
| ID|week|var|
+---+----+---+
| u1|  w1| 20|
| u2|  w1| 30|
| u3|  w2| 40|
+---+----+---+

我有另一个 PySpark 数据框 df2-

data2 = [(("u1", 'w1', 20)), (("u1", 'w2', 10)), (("u2", 'w1', 30)), (("u3", 'w2', 40)), (("u3", 'w2', 50)), (("u4", 'w1', 100)), (("u4", 'w2', 0))]
df2 = spark.createDataFrame(data2, ["ID", "week", "var"])
df2.show()

+---+----+---+
| ID|week|var|
+---+----+---+
| u1|  w1| 20|
| u1|  w2| 10|
| u2|  w1| 30|
| u3|  w2| 40|
| u3|  w2| 50|
| u4|  w1|100|
| u4|  w2|  0|
+---+----+---+

我只想保留 df1.ID

中存在 df2.ID 的 df2 行

期望的输出是-

+---+----+---+
| ID|week|var|
+---+----+---+
| u1|  w1| 20|
| u1|  w2| 10|
| u2|  w1| 30|
| u3|  w2| 40|
| u3|  w2| 50|
+---+----+---+

我该如何完成?

这种匹配记录条件可以使用left_semijoin

df3 = df2.join(d1,df2.ID == df1.ID, 'left_semi')

df3 将包含 df2 的所有记录(所有列),这些记录在 df1 中具有 匹配的复合键 .