当前位置: 首页 > 知识库问答 >
问题:

是否有完全外部联接的替代方法来比较没有键列的 PySpark 数据帧?

谭炎彬
2023-03-14

所以我一直在寻找不同的方法来比较两个没有键列的PySpark数据帧。

假设我有两个数据帧,df1

我的想法是,我将得到一个输出数据帧,其中包含df1中与df2中任何行都不匹配的行,反之亦然。我还想要一些标志,以便区分df1中的行和df2中的行。

到目前为止,我已经将完全外部连接视为方法,例如:

columns = df1.columns
df1 = df1.withColumn("df1_flag", lit("X"))
df2 = df2.withColumn("df2_flag", lit("X"))
df3 = df1.join(df2, columns, how = 'full')\
    .withColumn("FLAG", when(col("df1_flag").isNotNull() & col("df2_flag").isNotNull(), "MATCHED")\
    .otherwise(when(col("df1_flag").isNotNull(), "df1").otherwise("df2"))).drop("df1_flag","df2_flag")
df4 = df3.filter(df3.flag != "MATCHED")

完整的外部连接的问题是我可能需要处理一些非常大的数据帧(100万记录),我关心效率。我想过使用反左连接和反右连接,然后组合,但仍然有效率方面的担忧。

有没有我在这里忽略的比较方法可以对非常大的数据帧更有效?

共有1个答案

葛胡媚
2023-03-14

您可以在数据框上运行减号查询

Mismatvhed_df1 = df1.exceptAll(df2)
Mismatvhed_df2 = df2.exceptAll(df1)
 类似资料:
  • 我在pyspark有两个数据框。如下所示,df1保存来自传感器的整个long_lat。第二个数据帧df2是第一个数据帧的子集,其中lat-long值被向上舍入到2位小数,然后删除重复项以保留唯一的lat_long数据点。 DF1: df2: 因此,df2 的行数比第一个少得多。在 df2 中,我应用了一个 udf 来计算状态名称。 现在我想在 df1 中填充状态名称。由于 df2 的 lat_lo

  • 问题内容: 根据Google搜索:由于MySQL不支持完全外部联接,因此可以通过union和/或union all模拟它。但是,这两者要么删除正版副本,要么显示伪造副本。 什么是正确有效的方式? 这个问题似乎相关,但无法获得答案。 问题答案: 您可以使用左联接和右联接: 在Wikipedia上也有关于此主题的一些信息:完全外部联接。 维基百科文章建议在MySQL中使用UNION。这比UNION A

  • 问题内容: 如何使用django QuerySet API创建跨M2M关系芯片的完全外部联接的查询? 它不受支持,欢迎提供有关创建我自己的经理来执行此操作的提示。 编辑添加: @ S.Lott:感谢您的启发。应用程序需要使用OUTER JOIN。即使它仍然不完整,它也必须生成一个报告,显示输入的数据。我不知道结果将是一个新的类/模型。您的提示将对我有很大帮助。 问题答案: Django在通常的SQ

  • 问题内容: 我正在尝试编写一个join语句来将以下三个数据集连接在一起。(这是使用MS SQL Server的) 我认为完全可以通过外部联接来做到这一点,但是我遇到了主要的跨产品问题。 问题答案: 试试看:

  • 现在表1和表2没有使用外键的直接关系。对应的JPA实体如下所示: 我的代码看起来像: 则尝试使用以下方法获取值: Table2有大约6列带有@id注释,而我不能将它更改为只有两列带有@id注释。 请告诉我: > 如果有可能为我的方法1(select子句中的子查询)使用CriteriaBuilder编写代码。 请注意,我使用的是普通的JPAAPI。DB是Oracle11g。JDK版本为1.7。

  • 问题内容: 是否可以在不使用JPA在数据库中创建外键的情况下建立ManyToOne关联? 这些表由另一个系统拥有,并异步填充。因此,数据库中不能有FK。几乎总是,最终还是有联系。 问题是,即使ConstraintMode.NO_CONSTRAINT,JPA SchemaUpdate也会尝试添加FK。 [错误] ohthSchemaUpdate-无法添加外键约束 如果它没有使其余语句失败,我们可以忽