我正在努力更好地学习pyspark,我正在流式传输tweet,并试图从tweet的文本中捕获hashtags(我知道twitterapi的json已经提供了hashtags,我这样做是为了练习)。
所以用一个名为 Hashtags
,
-------------------------------------------
Batch: 18
-------------------------------------------
+--------------------+--------------------+
| value| Hashtags|
+--------------------+--------------------+
|Instead, it has c...|[instead,, it, ha...|
| #iran #abd #Biden |[#iran, #abd, #bi...|
+--------------------+--------------------+
我将“value”列设为小写,按空格/制表符/换行符拆分,从而创建一个名为“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条答案
按热度按时间bwntbbo31#
array_remove
不能与regex一起使用。你可以考虑使用filter
与rlike
取而代之的是: