值在另一个 Dataframe 中的Pyspark过滤器

c9qzyr3d  于 2023-02-07  发布在  Spark
关注(0)|答案(3)|浏览(170)

我有两个数据框。我需要过滤其中一个,以便只显示另一个中包含的值。
表_a:

+---+----+
|AID| foo|
+---+----+
| 1 | bar|
| 2 | bar|
| 3 | bar|
| 4 | bar|
+---+----+

表b:

+---+
|BID|
+---+
| 1 |
| 2 |
+---+

最后,我想过滤掉table_a中的内容,只保留table_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之外,我不能添加任何其他导入

ssm49v7z

ssm49v7z1#

您可以连接这两个表并指定how = 'left_semi'
left semi-join从关系的左侧返回与右侧匹配的值。

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|
+---+---+
wgxvkvu9

wgxvkvu92#

如果您在第二个 Dataframe 中有重复值或多个值,并且您希望仅采用不同的值,则以下方法可用于处理此类用例-

创建数据框架

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|
+---+---+

获取 Dataframe 2中val列的所有唯一值,并接受集合/列表变量

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|
+----+----+--------+
dfty9e19

dfty9e193#

这也应该行得通:

table_a.where( col(AID).isin(table_b.BID.tolist() ) )

相关问题