如何使用 pyspark 2.1.0 选择另一个数据框中不存在的行?

Posted

技术标签:

【中文标题】如何使用 pyspark 2.1.0 选择另一个数据框中不存在的行?【英文标题】:How to select rows that are not present in another dataframe ith pyspark 2.1.0? 【发布时间】:2021-06-08 09:31:08 【问题描述】:

环境

pyspark 2.1.0

上下文

我有两个具有以下结构的数据框:

数据框 1:

id | ... | distance

数据框 2:

id | ... | distance | other calculated values

第二个数据框是根据数据框 1 的过滤器创建的。此过滤器从数据框 1 中仅选择距离

请注意,dataframe1 将在多行中包含相同的 ID。

问题

我需要从数据框 1 中选择 ID 未出现在数据框 2 中的行。

目的是选择ID不小于或等于30.0的行。

经过测试的解决方案

我试过leftanti加入,根据不是官方文档而是互联网上的消息来源(因为,嘿,他们为什么要解释它?):select all rows from df1 that are not present in df2

distinct_id_thirty = within_thirty_km \
    .select("id") \
    .distinct()
not_within_thirty_km = data_with_straight_distance.join(
        distinct_id_thirty,
        "id",
        "leftanti")

地点:

within_thrity_kmdata_with_straight_distance 上的过滤器 filter(col("distance") <= 30.0) 产生的数据帧 data_with_straight_distance 是一个包含所有数据的数据框。 distinct_id_thirty 是一个数据帧,其中包含与数据帧 within_thirty_km 不同的 ID 列表

问题

上面返回距离低于 30 的数据。所以我认为我做错了什么:

我在这里做错了什么? 这是解决这个问题的好方法吗?如果没有,我应该如何处理?

编辑:

这是我所期望的一个最小示例:

data = [
    ("1", 15),
    ("1", 35),
    ("2", 15),
    ("2", 30),
    ("3", 35)]

data = spark.createDataFrame(data, ['id', 'distance'])

data.show()

thirty = data.filter(col("distance") <= 30)

dist_thirty = thirty.select("id").distinct()

not_in_thirty = data.join(dist_thirty, "id", "left_anti")

print("thirty")
thirty.show()

print("distinst thirty")
dist_thirty.show()

print("not_in_thirty")
not_in_thirty.show()

输出:

+---+--------+
| id|distance|
+---+--------+
|  3|      35|
+---+--------+

但我确实得到距离

【问题讨论】:

【参考方案1】:

"leftanti" 应按照以下文档替换为 "left_anti": https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.join

【讨论】:

你的意思是data_with_straight_distance.join(distinct_id_thirty, "id", "leftanti").where(isNull('data_with_straight_distance.id')) 吗? 我不得不承认我不明白你的回答。空 ID 的链接是什么?我没有空 ID。 我的错,我的回答超出了范围。我不知道反连接在哪里。但是在查看文档时,它似乎应该写成“left_anti”:spark.apache.org/docs/2.4.0/api/python/… 看来你是对的。它是left_anti,而不是leftanti。为什么 spark 不抛出错误? @thebot:您能否更新您的答案,以便对其进行投票?

以上是关于如何使用 pyspark 2.1.0 选择另一个数据框中不存在的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用pyspark将两列值组合到另一列?

如何使用 pyspark(2.1.0) LdA 获取与每个文档相关的主题?

Pyspark:如何根据另一列的值填充空值

Pyspark如何将一列与数据框中另一列的结果相乘?

如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况

带有选择位置的 pyspark 新列