Pyspark筛选器,其中值位于另一个数据帧中

Pyspark筛选器,其中值位于另一个数据帧中,pyspark,Pyspark,我有两个数据帧。我需要过滤其中一个,以仅显示另一个中包含的值 表a: +---+----+ |AID| foo| +---+----+ | 1 | bar| | 2 | bar| | 3 | bar| | 4 | bar| +---+----+ 表b: +---+ |BID| +---+ | 1 | | 2 | +---+ 最后,我想过滤掉表_a中的内容,只过滤掉表_b中的ID,如下所示: +--+----+ |ID| foo| +--+----+ | 1| bar| | 2| bar| +

我有两个数据帧。我需要过滤其中一个,以仅显示另一个中包含的值

表a:

+---+----+
|AID| foo|
+---+----+
| 1 | bar|
| 2 | bar|
| 3 | bar|
| 4 | bar|
+---+----+
表b:

+---+
|BID|
+---+
| 1 |
| 2 |
+---+
最后,我想过滤掉表_a中的内容,只过滤掉表_b中的ID,如下所示:

+--+----+
|ID| foo|
+--+----+
| 1| bar|
| 2| bar|
+--+----+
这就是我要做的

result_table = table_a.filter(table_b.BID.contains(table_a.AID))
但这似乎不起作用。看起来我得到了所有的价值


注意:除了
pyspark.sql.functions import col

之外,我无法添加任何其他导入。您可以将两个表连接起来,并指定
how='left\u semi'

左半联接
返回与右半联接匹配的关系左侧的值

result_table  = table_a.join(table_b, (table_a.AID == table_b.BID), \
                        how = "left_semi").drop("BID")

result_table.show()
+---+---+
|AID|foo|
+---+---+
|  1|bar|
|  2|bar|
+---+---+

若您在第二个数据帧中有重复的或多个值,并且您希望只获取不同的值,那个么下面的方法对于处理此类用例非常有用-

创建数据帧

df = spark.createDataFrame([(1,"bar"),(2,"bar"),(3,"bar"),(4,"bar")],[ "col1","col2"])
df_lookup = spark.createDataFrame([(1,1),(1,2)],[ "id","val"])
df.show(truncate=True)
df_lookup.show()
+----+----+
|col1|col2|
+----+----+
|   1| bar|
|   2| bar|
|   3| bar|
|   4| bar|
+----+----+

+---+---+
| id|val|
+---+---+
|  1|  1|
|  1|  2|
+---+---+
df_lookup_var = df_lookup.groupBy("id").agg(F.collect_set("val").alias("val")).collect()[0][1][0]
print(df_lookup_var)
df = df.withColumn("case_col", F.when((F.col("col1").isin([1,2])), F.lit("1")).otherwise(F.lit("0")))
df = df.filter(F.col("case_col") == F.lit("1"))
df.show()
+----+----+--------+
|col1|col2|case_col|
+----+----+--------+
|   1| bar|       1|
|   2| bar|       1|
+----+----+--------+
获取数据帧2中val列的所有唯一值,并获取一个set/list变量

df = spark.createDataFrame([(1,"bar"),(2,"bar"),(3,"bar"),(4,"bar")],[ "col1","col2"])
df_lookup = spark.createDataFrame([(1,1),(1,2)],[ "id","val"])
df.show(truncate=True)
df_lookup.show()
+----+----+
|col1|col2|
+----+----+
|   1| bar|
|   2| bar|
|   3| bar|
|   4| bar|
+----+----+

+---+---+
| id|val|
+---+---+
|  1|  1|
|  1|  2|
+---+---+
df_lookup_var = df_lookup.groupBy("id").agg(F.collect_set("val").alias("val")).collect()[0][1][0]
print(df_lookup_var)
df = df.withColumn("case_col", F.when((F.col("col1").isin([1,2])), F.lit("1")).otherwise(F.lit("0")))
df = df.filter(F.col("case_col") == F.lit("1"))
df.show()
+----+----+--------+
|col1|col2|case_col|
+----+----+--------+
|   1| bar|       1|
|   2| bar|       1|
+----+----+--------+

这可能是正确的答案,但当我尝试这样做的时候,我会犯一个恼人的错误。这里有更多细节:我认为在列名中有一些模棱两可的地方。在进行联接之前,请尝试重命名列。