如何在过滤器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)

我的目标是过滤掉任何同时包含 authlogin 关键字的网址,但它们可能位于字符串的任何位置。

在 sql 中我可以使用 %auth%login%,% 表示任意长度的字符串。

如何在 pyspark 语法中轻松做到这一点?

忘了说,有'auth'页面我不想过滤掉,我只想在login也在字符串中的时候过滤掉auth

我不知道为什么这被标记为 dups,这是 RDD 而不是数据帧

【问题讨论】:

【参考方案1】:

使用 PySpark RDD 过滤方法,您只需要确保loginauth 中的至少一个不在字符串中,在 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中过滤掉某种模式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:在“NoneType”对象上过滤掉 RDD 元素失败是不可迭代的

过滤掉pyspark RDD中的非数字值

在pyspark中过滤两个RDD

如何从 Pyspark 中的 RDD 中过滤

在PySpark / Python RDD中过滤

Pyspark - 使用广播字典中的日期过滤 RDD