【问题标题】:How to filter out a certain pattern in filter pyspark RDD [duplicate]如何在过滤器pyspark RDD中过滤掉某种模式[重复]
【发布时间】: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 而不是数据帧

【问题讨论】:

    标签: regex apache-spark pyspark 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 的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多