如何在过滤器pyspark RDD中过滤掉某种模式[重复]
Posted
技术标签:
【中文标题】如何在过滤器pyspark RDD中过滤掉某种模式[重复]【英文标题】:How to filter out a certain pattern in filter pyspark RDD [duplicate] 【发布时间】:2020-01-28 00:16:48 【问题描述】:我初始化了一个 pyspark sc。
instance = (data
.filter(lambda x: len(x) != 0 )
.filter(lambda x: ('%auth%login%' not in url)
.map(lambda x: function(x))
.reduceByKey(lambda x, y: x + y)
我的目标是过滤掉任何同时包含 auth 和 login 关键字的网址,但它们可能位于字符串的任何位置。
在 sql 中我可以使用 %auth%login%,% 表示任意长度的字符串。
如何在 pyspark 语法中轻松做到这一点?
忘了说,有'auth'页面我不想过滤掉,我只想在login也在字符串中的时候过滤掉auth
我不知道为什么这被标记为 dups,这是 RDD 而不是数据帧
【问题讨论】:
【参考方案1】:使用 PySpark RDD 过滤方法,您只需要确保login
或auth
中的至少一个不在字符串中,在 Python 代码中:
data.filter(lambda x: any(e not in x for e in ['login', 'auth']) ).collect()
【讨论】:
此方法不起作用,因为我确实想保留一些“auth”页面,我只想在 url 中同时存在关键字(auth 和 login)时排除。我将探索所有方法 @inuyashayolo,如果login
不存在,这将保留包含auth
的网址。正如我在帖子中提到的那样。两者中的任何一个都不存在,这基本上是仅排除两者都存在的情况。请对一些示例 URL 进行测试以进行验证。
或者换句话说,这个条件意味着以下三个中的任何一个:(1)auth
不存在,(2)login
不存在,(3)auth
也不存在login
存在。
刚刚在 python any(e not in x for e in ['login', 'auth']) 中测试了这部分。它适用于相互。我不确定为什么这个问题被标记为 dups,因为它是 rdd 而不是数据框。谢谢@jxc【参考方案2】:
如果您使用的是数据框,您正在寻找contains:
#url is the column name
df = df.filter(~df.url.contains('auth') & ~df.url.contains('login'))
当您使用 RDD 时,请查看jxc 的答案。
【讨论】:
以上是关于如何在过滤器pyspark RDD中过滤掉某种模式[重复]的主要内容,如果未能解决你的问题,请参考以下文章