我想从一个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
的条件,则行是好的。两个数据帧的长度也不必相同。
对于我来说,已经很清楚如何进行id
或df2
之类的精确匹配,但是对于这种更为宽大的案例,我还不清楚。
编辑:我的新想法是,如果没有预先构建或干净的方法来执行此操作,则如果它们是可并行化的,则可能支持基于已定义函数的复杂过滤。我会从那条Google跟踪开始,并在找到该方向时进行更新。
编辑:到目前为止,我偶然发现了isin
函数,但是我还没有设法使其起作用。我想我需要使其接受一列而不是单个数字。这就是我到目前为止的情况。
antijoin
当前会引发错误
udf
答案 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
连接到df2
和df1.id
之间的差的绝对值小于或等于10的df2.id
,并且仅从{{1}中选择列}。