使用正则表达式过滤大型 pyspark 数据帧

Filtering a large pyspark dataframe with regex

提问人:PracticingPython 提问时间:8/27/2021 更新时间:8/27/2021 访问量:935

问:

我有一个大型 pyspark 数据帧,其中包含超过 50,000 行数据。一列包含我尝试对其执行正则表达式搜索的每条记录的文档文本。

以下是我构建的正则表达式代码和模式:

import re

words    = {"other", "this","that"}
maxInter = 3 # maximum intermediate words between the target words

wordSpan = len(words)+maxInter*(len(words)-1)

anyWord  = "|".join(words)
allWords = "".join(r"(?=(\w+\W*){0,SPAN}WORD\b)".replace("WORD",w) 
                    for w in words)
allWords = allWords.replace("SPAN",str(wordSpan-1))
                    
pattern = r"\bALL(\b(ANY)(\W+\w+\W*){0,INTER}){COUNT,COUNT}"
pattern = pattern.replace("COUNT",str(len(words)))
pattern = pattern.replace("INTER",str(maxInter))
pattern = pattern.replace("ALL",allWords)
pattern = pattern.replace("ANY",anyWord)

print(pattern)

\b(?=(\w+\W*){0,8}that\b)(?=(\w+\W*){0,8}this\b)(?=(\w+\W*){0,8}other\b)(\b(that|this|other)(\W+\w+\W*){0,3}){3,3}

下面是我尝试用来过滤我的 pyspark 数据帧的内容,但似乎有些东西工作不正常。

from pyspark.sql.functions import col

filtered = df.filter(col("attachment_text").rlike(pattern))

我已经验证了这适用于字符串和 pandas 系列的常规列表,虽然上面的代码运行(非常快)而不会引发任何错误,但当我尝试获取简单的行计数 (filtered.count()) 时,我的会话似乎只是坐在那里。它似乎正在“工作”,但似乎永远不会完成。

事实上,过滤本身似乎在如此大的数据集上移动得如此之快,这让我怀疑那段代码可能有问题,但我不确定。大型数据集应该会导致这需要更长的时间,但是我等待简单行计数的时间没有意义。

任何想法都值得赞赏!

python 正则表达式 pyspark

评论

0赞 Steven 8/27/2021
您是否在像 regex101.com 这样的网站上尝试过您的数据和当前正则表达式?只是为了尝试它是否匹配任何东西
0赞 Steven 8/27/2021
如果你的意思是这条线很快,这是完全正常的。这是一个转变,转换是懒惰的火花。它们仅在执行操作时计算,是操作。filtered = df.filter(col("attachment_text").rlike(pattern))count
0赞 Wiktor Stribiżew 8/27/2021
这可能是因为灾难性的回溯,请尝试替换 和 ,即替换为 (但删除 ) 并使所有组不捕获 (替换为 )。r"(?=(\w+\W*){0,SPAN}WORD\b)"r"(?=(?:\w+\W+){0,SPAN}WORD\b)"r"\bALL(\b(ANY)(\W+\w+\W*){0,INTER}){COUNT,COUNT}"r"\bALL(?:\b(?:ANY)(?:\W+\w+){0,INTER}){COUNT,COUNT}"\W*\W+\W+\w+\W*((?:
0赞 PracticingPython 8/27/2021
@WiktorStribiżew 当我在相同的字符串列表(比 pyspark 数据帧小得多的集合)上尝试此操作时,我没有得到与以前相同的结果。当我在 pyspark 上尝试此操作时,我得到了相同的结果,似乎可以工作,但不清楚它何时完成或是否会完成。

答: 暂无答案