为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

料青山看我应如是 2021-09-25 22:06:45
我想从一个 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+deltainRangeUDF = 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.
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 370 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信