我正在寻找一种基于一列查找两个DataFrame的区别的方法。例如:
from pyspark.sql import SQLContext
sc = SparkContext()
sql_context = SQLContext(sc)
df_a = sql_context.createDataFrame([("fa", 3), ("fb", 5), ("fc", 7)], ["first name", "id"])
df_b = sql_context.createDataFrame([("la", 3), ("lb", 10), ("lc", 13)], ["last name", "id"])
DataFrame A:
+----------+---+
|first name| id|
+----------+---+
| fa| 3|
| fb| 5|
| fc| 7|
+----------+---+
DataFrame B:
+---------+---+
|last name| id|
+---------+---+
| la| 3|
| lb| 10|
| lc| 13|
+---------+---+
我的目标是考虑列ID来找到DataFrame A和DataFrame B的区别,输出将是以下DataFrame
+---------+---+
|last name| id|
+---------+---+
| lb| 10|
| lc| 13|
+---------+---+
我不想使用以下方法:
a_ids = set(df_a.rdd.map(lambda r: r.id).collect())
df_c = df_b.filter(~col('id').isin(a_ids))
我正在寻找一种高效的方法(就内存和速度而言),我不必收集id(id的大小可以是数十亿),也许像RDDs SubtractByKey一样,但适用于DataFrame
PS:我可以将df_a映射到RDD,但是我不想将df_b映射到RDD
答案 0 :(得分:0)
您可以在列left_anti
上进行id
连接:
df_b.join(df_a.select('id'), how='left_anti', on=['id']).show()
+---+---------+
| id|last name|
+---+---------+
| 10| lb|
| 13| lc|
+---+---------+