如何在PySpark中去除字符串的重音特殊字符?
去除Spark DataFrame中字符串列的重音字符
一、解决特殊字符显示为问号的问题
创建DataFrame时特殊字符变成问号,核心原因是编码不匹配,可通过以下方式解决:
- 确保代码文件保存为UTF-8编码(多数编辑器默认支持,需确认编码设置)。
- 终端运行时,设置编码为UTF-8:
- Linux/macOS:执行
export LC_ALL=en_US.UTF-8 - Windows:命令行执行
chcp 65001
- Linux/macOS:执行
- 直接传入Python3默认的Unicode字符串创建DataFrame(无需额外转义):
from pyspark.sql import functions as F from pyspark.sql.types import StructType, StructField, StringType df = spark.createDataFrame( data=[("Vitória",), ("João",), ("Maurício",)], schema=StructType([StructField("name", StringType(), True)])) df.show()
配置正确后,显示结果会正常展示特殊字符:
+---------+ | name| +---------+ | Vitória | | João | |Maurício | +---------+
二、有效去除重音字符的方法
方法1:使用Spark内置unaccent函数(推荐,Spark 3.0+)
Spark 3.0及以上版本提供了专门的unaccent函数,可直接去除字符重音标记,无需手动映射:
from pyspark.sql.functions import unaccent df = df.withColumn("unaccent", unaccent(df.name)) df.show()
输出结果:
+---------+---------+ | name|unaccent | +---------+---------+ | Vitória | Vitoria| | João | Joao | |Maurício | Mauricio| +---------+---------+
方法2:自定义映射结合translate函数(兼容低版本Spark)
若Spark版本低于3.0,可继续使用translate函数,需确保映射字符的编码完全匹配:
from pyspark.sql.functions import translate # 定义重音字符与无重音字符的一一映射 accent_chars = "áãâàéêèíîìóõôòúûùç" no_accent_chars = "aaaaeeeiiioooouuuc" df = df.withColumn("unaccent", translate(df.name, accent_chars, no_accent_chars)) df.show()
输出结果与上述一致,需注意映射字符串必须准确对应,否则会出现替换失效。
方法3:Python UDF结合unicodedata库(灵活扩展)
如需支持更多类型的重音字符,可自定义UDF利用Python的unicodedata模块处理:
import unicodedata from pyspark.sql.functions import udf from pyspark.sql.types import StringType def remove_accent(s): if s is None: return None # 规范化字符串并过滤重音标记 normalized = unicodedata.normalize('NFKD', s) return ''.join([c for c in normalized if not unicodedata.combining(c)]) remove_accent_udf = udf(remove_accent, StringType()) df = df.withColumn("unaccent", remove_accent_udf(df.name)) df.show()
该方法兼容性更强,但性能略低于Spark内置函数,适合小批量数据处理。
内容的提问来源于stack exchange,提问作者Tiago Shimizu
相关产品推荐
相关产品推荐

