我有两个数据帧。我需要过滤一个以仅显示另一个中包含的值。
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
答案 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|
+----+----+--------+