python - pyspark 中仅基于一列的两个 DataFrame 之间的差异
问题描述
我正在寻找一种方法来根据一列找到两个 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
解决方案
您可以left_anti
在列上进行连接id
:
df_b.join(df_a.select('id'), how='left_anti', on=['id']).show()
+---+---------+
| id|last name|
+---+---------+
| 10| lb|
| 13| lc|
+---+---------+
推荐阅读
- flutter - Flutter BLoC (flutter_bloc) 是否与 onDispose 等效?
- sql-server - MDX where 子句与 From 子句
- javascript - 使用打字稿的函数中的es6解构参数
- apache-spark - pyspark RDD 单词计算
- javascript - 由于警告:RequireJS 失败,所有检查都失败了。使用 --force 继续
- java - 无法在我的自定义列表视图中实现搜索视图
- javascript - 从 TS 到 JS 时,WebStorm 错误地将源文件标记为已排除
- java - Flutter:MainActivity 在 Java Native 代码中无法转换为 FlutterEngine
- visual-studio - 我无法在 Visual Studio 2019 上运行 Docker 微服务
- python - 如何通过 argv 和 python 中的控制台将参数传递给 mysql 连接器?