PySpark array_remove 元素正则表达式问题

Posted

技术标签:

【中文标题】PySpark array_remove 元素正则表达式问题【英文标题】:PySpark array_remove elements regex question 【发布时间】:2021-04-14 16:12:23 【问题描述】:

我正在尝试更好地学习 PySpark,我正在流式传输推文并尝试从推文的文本中捕获主题标签(我知道 twitter API 的 json 已经提供了主题标签,我这样做是为了练习)。

因此,使用名为 Hashtags 的 pyspark 数据框,

-------------------------------------------
Batch: 18
-------------------------------------------
+--------------------+--------------------+
|               value|            Hashtags|
+--------------------+--------------------+
|Instead, it has c...|[instead,, it, ha...|
|  #iran #abd #Biden |[#iran, #abd, #bi...|
+--------------------+--------------------+

我将“值”列设为小写,在空格/制表符/换行符上拆分,从而创建一个名为“Hashtags”的数组列,然后尝试删除仅包含空格的任何元素,以及任何不包含空格的元素不要以“#”开头。

Hashtags = Hashtags.withColumn("Hashtags", lower(Hashtags["value"]))
Hashtags = Hashtags.withColumn("Hashtags", split(Hashtags["Hashtags"], r'\s'))
Hashtags = Hashtags.withColumn("Hashtags", F.array_remove(Hashtags["Hashtags"], r'\s'))
Hashtags = Hashtags.withColumn("Hashtags", F.array_remove(Hashtags["Hashtags"], r'^(?!#).+'))

据我所知,array_remove() 确实删除了带有正则表达式 r'\s' 的元素,但它不会删除不以“#”开头的元素。

我知道正则表达式本身可以在 array_remove() 之外工作,因为我是这样测试它的:

RegText = r'^(?!#).+'
print(re.findall(RegText, "#AnandWrites"), re.match(RegText, "#AnandWrites"))
print(re.findall(RegText, "AnandWrites"), re.match(RegText, "AnandWrites"))
print(re.findall(RegText, "with\xe2\x80\xa6"), re.match(RegText, "with\xe2\x80\xa6"))
print(re.findall(RegText, "An#andWrites"), re.match(RegText, "An#andWrites"))

这给了我以下结果,表明它成功匹配了不以“#”开头的字符串

[] None
['AnandWrites'] <re.Match object; span=(0, 11), match='AnandWrites'>
['withâ\x80¦'] <re.Match object; span=(0, 7), match='withâ\x80¦'>
['An#andWrites'] <re.Match object; span=(0, 12), match='An#andWrites'>

【问题讨论】:

【参考方案1】:

array_remove 不能与正则表达式一起使用。您可以考虑将filterrlike 一起使用:

df2 = df.withColumn(
    'Hashtags', 
    F.expr(r"""
        filter(
            split(lower(value), '\\s'), 
            x -> x not rlike '\\s' and x not rlike '^(?!#).+'
        )
    """)
)

df2.show(truncate=False)
+-----------------+---------------------+
|value            |Hashtags             |
+-----------------+---------------------+
|Instead, it has  |[]                   |
|#iran #abd #biden|[#iran, #abd, #biden]|
+-----------------+---------------------+

【讨论】:

以上是关于PySpark array_remove 元素正则表达式问题的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark 中找到正则表达式?

在 PySpark 中提取多个正则表达式匹配项

PySpark 中的正则表达式

pyspark用正则表达式替换正则表达式

从字符串 PySpark 数据框列中删除正则表达式

应用逻辑后,正则表达式模式在 pyspark 中不起作用