PySpark按纯字母字符分组聚合脏字符串列并排除相似词的实现方案咨询
PySpark按纯字母字符分组聚合脏字符串列并排除相似词的实现方案咨询
嘿,这个需求我刚好处理过类似场景,给你几个实用的思路,核心是精准提取单词中的纯字母核心部分,同时保留不同字母组合的独立性,这样就能既合并前后带非字母的同词根变体,又不会误合并dates、dating这类不同的词:
方法一:正则提取核心纯字母单词(推荐)
利用PySpark的regexp_extract函数,精准捕获单词前后非字母字符包裹的纯字母序列,这样既能清理掉_date、!date、date,这类脏数据,又能让dates、dating这类不同字母组合的单词保持独立。
具体步骤如下:
- 导入PySpark函数库:
from pyspark.sql import functions as F
- 清洗word列,提取核心纯字母单词:
# 正则逻辑:匹配开头非字母→捕获连续字母序列→匹配结尾非字母 cleaned_df = dirty_df.withColumn( "clean_word", F.regexp_extract(F.col("word"), "^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$", 1) )
- 按清洗后的单词分组聚合求和,再调整列名:
result_df = cleaned_df.filter(F.col("clean_word") != "") # 过滤全非字母的无效单词 .groupBy("clean_word") .agg(F.sum("count").alias("count")) .select("count", F.col("clean_word").alias("word"))
- 查看结果:
result_df.show()
这样处理后,date的所有前后带非字母的变体都会被合并成date,总和就是32375+359+306+213=33253;snap的变体总和是209+204+107+12=532,完全符合你的目标,同时dates、dating这类单词会被保留为独立条目,不会被误合并。
补充说明
如果你的脏数据存在中间带非字母的情况(比如da!te),而你希望这类也合并为date,可以把正则调整为F.regexp_replace(F.col("word"), "[^a-zA-Z]", ""),直接移除所有非字母字符,但这种场景要根据你的实际数据情况来选择,毕竟你的需求明确要排除相似字母组合的单词,第一种方法的精准度更高。
备注:内容来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

