如何选择 pyspark 2.1.0 中不存在于另一个数据帧中的行?

问题描述

环境

  • 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_km 是过滤器 filter(col("distance") <= 30.0)data_with_straight_distance
  • 上产生的数据帧
  • data_with_straight_distance一个包含所有数据的数据框。
  • distinct_id_thirty一个数据框,其中包含来自数据框 within_thirty_km
  • 的不同 ID 列表

问题

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

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

编辑:

这是我期望的最小示例:

data = [
    ("1",15),("1",35),("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,"left_anti")

print("thirty")
thirty.show()

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

print("not_in_thirty")
not_in_thirty.show()

输出

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

但我确实得到了

解决方法

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