【问题标题】:Difference between two DataFrames based on only one column in pyspark [duplicate]基于pyspark中仅一列的两个DataFrame之间的差异[重复]
【发布时间】:2018-10-02 20:54:15
【问题描述】:

我正在寻找一种方法来根据一列查找两个 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))

我正在寻找一种有效的方法(在内存和速度方面),我不必收集 ids(ids 的大小可能是数十亿),可能类似于 RDDs SubtractByKey 但用于 DataFrame

PS:我可以将 df_a 映射到 RDD,但我不想将 df_b 映射到 RDD

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    您可以在id 列上加入left_anti

    df_b.join(df_a.select('id'), how='left_anti', on=['id']).show()
    +---+---------+
    | id|last name|
    +---+---------+
    | 10|       lb|
    | 13|       lc|
    +---+---------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 2016-02-14
      • 1970-01-01
      • 2015-09-12
      • 2016-06-12
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多