提问人:PracticingPython 提问时间:8/27/2021 更新时间:8/27/2021 访问量:935
使用正则表达式过滤大型 pyspark 数据帧
Filtering a large pyspark dataframe with regex
问:
我有一个大型 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()) 时,我的会话似乎只是坐在那里。它似乎正在“工作”,但似乎永远不会完成。
事实上,过滤本身似乎在如此大的数据集上移动得如此之快,这让我怀疑那段代码可能有问题,但我不确定。大型数据集应该会导致这需要更长的时间,但是我等待简单行计数的时间没有意义。
任何想法都值得赞赏!
答: 暂无答案
评论
filtered = df.filter(col("attachment_text").rlike(pattern))
count
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*
(
(?: