【问题标题】:pyspark not working with regexpyspark 不使用正则表达式
【发布时间】:2016-09-23 04:11:24
【问题描述】:

我从一个包含 url 列表的文件中创建了 RDD:

url_data = sc.textFile("url_list.txt")

现在我正在尝试使用包含“net.com”的所有行创建另一个 RDD,并且此字符串以非数字或字母符号开头。我的意思是包含带有 .net.com 或 \tnet.com 的行,排除 internet.com 或 cnet.com。

filtered_data = url_data.filter(lambda x: '[\W]net\.com' in x)

但是这条线没有给出任何结果。 如何使 pyspark shell 与正则表达式一起使用?

【问题讨论】:

  • '[\W]net\.com' in '.net.com' 在 python 中返回 False。所以,这是一个 python 问题而不是 pyspark 问题
  • 知道什么是正确的正则表达式吗?
  • \.+[a-zA-Z]+\.com 看起来像你想要的正则表达式命令(在这里测试:regexr.com)。但它并没有像你需要的那样无缝集成到 python 中。看起来您可以在 SQL 查询中使用它(例如:stackoverflow.com/questions/34952985/…
  • @lacerated:你试过r"\Wnet\.com"吗?这也会引发任何错误吗?实际上,正则表达式 [\W]net\.com 在 Python 中运行良好:ideone.com/kx8U3V
  • @WiktorStribiżew:是的,r"\Wnet\.com" 也试过了。当我尝试执行像filtered_data.take(1) 这样的操作时,我没有收到任何错误,只是一个空字符串[]。如果我尝试filtered_data.first(),它会说:ValueError: RDD is empty。想知道我是否需要导入一些 pyspark 模块以使 reg 表达式在 spark 中工作,例如 python 中的import re。如果我只做filtered_data = url_data.filter(lambda x: 'net.com' in x),它会过滤得很好,但我会得到我不需要的额外行。

标签: regex pyspark


【解决方案1】:

为什么不在 python 中定义一个使用 re 或 re2(快得多)包的函数,如果匹配则返回 Bool。

def url_filter(url):
    pattern = re.compile(r'REGEX_PATTERN')
    match = pattern.match(URL)
    if match:
        return True
    else:
        return False

然后将其传递给过滤函数url_data.filter(lambda x: python_regex_fuction(x))

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多