pyspark数组\u remove elements regex问题

xzv2uavs  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(347)

我正在努力更好地学习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'>
bwntbbo3

bwntbbo31#

array_remove 不能与regex一起使用。你可以考虑使用 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]|
+-----------------+---------------------+

相关问题