Pyspark筛选器,其中值位于另一个数据帧中
我有两个数据帧。我需要过滤其中一个,以仅显示另一个中包含的值 表a: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| +
+---+----+
|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|
+----+----+--------+
这可能是正确的答案,但当我尝试这样做的时候,我会犯一个恼人的错误。这里有更多细节:我认为在列名中有一些模棱两可的地方。在进行联接之前,请尝试重命名列。