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
不能与正则表达式一起使用。您可以考虑将filter
与rlike
一起使用:
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 元素正则表达式问题的主要内容,如果未能解决你的问题,请参考以下文章