过滤pyspark DataFrame,其中行在另一个DataFrame的范围内

我想从一个 DataFrame ( df1) 中检索所有行,使其id在id另一个 DataFrame ( df2)列中的任何值的 +- 10 以内。


例子:


df1.show()

#+-----+---+

#| word| id|

#+-----+---+

#|apple| 10|

#|  cat| 30|

#+-----+---+ 


df2.show()

#+----+---+

#|word| id|

#+----+---+

#|some| 50|

#|jeff|  3|

#| etc|100|

#+----+---+

预期结果:


+-----+---+

| word| id|

+-----+---+

|apple| 10|

+-----+---+

这是因为"apple"在 10 以内"jeff"。


如您所见,如果idindf1满足任何idin的条件,则行是好的df2。两个 DataFrame 的长度也不一定相同。


我已经很清楚如何为精确匹配做类似 anisin或 an 的事情antijoin,但我不清楚这个更宽松的情况。


编辑:我的一个新想法是,如果没有预先构建或干净的方法来做到这一点,那么如果它们是可并行的,则可能支持基于已定义函数的复杂过滤。如果我找到朝那个方向的方法,我将开始沿着那条谷歌路径进行更新。


编辑:到目前为止,我偶然发现了udf函数,但我还没有设法让它工作。我想我需要让它以某种方式接受一列而不是单个数字。这是我到目前为止所拥有的..


columns = ['word', 'id']

vals = [

     ("apple",10),

     ("cat",30)

]


df1 = sqlContext.createDataFrame(vals, columns)


vals = [

     ("some",50),

     ("jeff",3),

     ("etc",100)

]


df2 = sqlContext.createDataFrame(vals, columns)


def inRange(id1,id2,delta):

    id1 = int(id1)

    id2 = int(id2)

    return id1>=id2-delta and id1<=id2+delta

inRangeUDF = udf(inRange,BooleanType())


df1.filter(inRangeUDF(df1.id,df2.id, 10)).show()

这当前抛出错误


TypeError: Invalid argument, not a string or column: 10 of type <class 'int'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.


料青山看我应如是
浏览 372回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python