筛选pyspark DataFrame,其中行在另一个DataFrame的范围内

时间:2018-12-26 13:48:11

标签: python dataframe pyspark apache-spark-sql pyspark-sql

我想从一个DataFrame(df1中检索所有行,以使其id在另一个DataFrame({{1 }}。

示例:

id

所需结果:

df2

这是因为df1.show() #+-----+---+ #| word| id| #+-----+---+ #|apple| 10| #| cat| 30| #+-----+---+ df2.show() #+----+---+ #|word| id| #+----+---+ #|some| 50| #|jeff| 3| #| etc|100| #+----+---+ +-----+---+ | word| id| +-----+---+ |apple| 10| +-----+---+ 的10以内。

如您所见,如果"apple"中的"jeff"符合id中任何df1的条件,则行是好的。两个数据帧的长度也不必相同。

对于我来说,已经很清楚如何进行iddf2之类的精确匹配,但是对于这种更为宽大的案例,我还不清楚。

编辑:我的新想法是,如果没有预先构建或干净的方法来执行此操作,则如果它们是可并行化的,则可能支持基于已定义函数的复杂过滤。我会从那条Google跟踪开始,并在找到该方向时进行更新。

编辑:到目前为止,我偶然发现了isin函数,但是我还没有设法使其起作用。我想我需要使其接受一列而不是单个数字。这就是我到目前为止的情况。

antijoin

当前会引发错误

udf

1 个答案:

答案 0 :(得分:2)

您无法将DataFrame传递给udf。完成此操作的自然方法是使用join

import pyspark.sql.functions as f

df1.alias('l').join(
    df2.alias('r'), 
    on=f.abs(f.col('l.id') - f.col('r.id')) <= 10
).select('l.*').show()
#+-----+---+
#| word| id|
#+-----+---+
#|apple| 10|
#+-----+---+

我使用alias来避免在指定DataFrame列名称时的歧义。这将df1连接到df2df1.id之间的差的绝对值小于或等于10的df2.id,并且仅从{{1}中选择列}。