Pyspark过滤器,其中值位于另一个数据框中

时间:2020-10-21 02:53:23

标签: pyspark

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

table_a:

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

table_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

,我无法添加其他任何导入

2 个答案:

答案 0 :(得分:0)

您可以联接两个表并指定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|
+---+---+

答案 1 :(得分:0)

如果第二个数据帧中有重复值或多个值,并且只想使用不同的值,则以下方法对于解决此类用例可能很有用-

创建数据框

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

获取数据框2中val列的所有唯一值,并获取set / list变量

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|
+----+----+--------+
相关问题