Pyspark比较列字符串,如果字母字符集相同则分组,但避免相似的单词?

vtwuwzda  于 2023-04-11  发布在  Spark
关注(0)|答案(2)|浏览(176)

我正在做一个项目,我有一个pyspark数据框的两个列(字符串,字符串计数)分别是字符串和bigint。数据集是脏的,以至于一些单词附加了一个非字母字符(例如'date','_date','!date'和'date,'都是单独的项目,但应该只是'date')

print(dirty_df.schema)
output---> StructType([StructField('count', LongType(), True), StructField('word', StringType(), True)])
dirty_df.show()
+------+------+
| count|  word|
+------+------+
|32375 |  date|
|359   | _date|
|306   | !date|
|213   | date,|
|209   |  snap|
|204   | ^snap|
|107   | +snap|
|12    | snap?|

我需要减少dataframe,这样date,_date,!date和date都只是'date',它们的计数被更新以匹配。问题是:我需要避免加入类似的单词,如“日期”,“约会”,“约会”,“今天”等。

目标

+------+------+
| count|  word|
+------+------+
|33253 |  date|
|532   |  snap|

你觉得我该怎么做?

eqzww0vc

eqzww0vc1#

使用**regexp_replace**函数,替换所有特殊字符([^a-zA-Z] replace all characters other than alphabets)

一米二米一x

df = spark.createDataFrame([(32375,'date'),(359,'_date'),(306,'[date'),(213,'date]'),(209,'snap'),(204,'_snap'),(107,'[snap'),(12,'snap]')],['count','word'])
df.withColumn("word",regexp_replace(col("word"),"[^a-zA-Z]","")).groupBy("word").agg(sum(col("count")).alias("count")).show(10,False)
#+----+-----+
#|word|count|
#+----+-----+
#|date|33253|
#|snap|532  |
#+----+-----+

Other way:

如果只想替换特定字符,则使用**translate**函数

df.withColumn("word",expr('translate(word,"(_|]|[)","")')).groupBy("word").agg(sum(col("count")).alias("count")).show(10,False)

#+----+-----+
#|word|count|
#+----+-----+
#|date|33253|
#|snap|532  |
#+----+-----+
tp5buhyn

tp5buhyn2#

您可以使用regex_replace删除任何特殊字符。

df = (df.withColumn('word', F.regexp_replace('word', '[^a-zA-Z]', ''))
      .groupby('word')
      .agg(F.sum('count').alias('count')))

[^a-zA-Z],此正则表达式将匹配除小写和大写字母以外的任何字符other(^ not operator)。

相关问题