这个问题很简单,在某些语言中使用字符串可以去除变音符号。例如,取"téléphone"会产生结果"phone"。
在Java中,我可以使用这样的方法:
public static String removeAccents(String str){
return Normalizer.normalize(str, Normalizer.Form.NFD).replaceAll("\p{InCombiningDiacriticalMarks}+", "");
}
它工作得很好,但在scala中它不。。。我尝试了如下代码:
val str = Normalizer.normalize("téléphone",Normalizer.Form.NFD)
val exp = "\p{InCombiningDiacriticalMarks}+".r
exp.replaceAllIn(str,"")
它不起作用!
我想,我在Scala中使用Regex时遗漏了一些东西,所以任何帮助都将不胜感激。
我在使用Normalizer时遇到了同样的问题。从Apache Commons StringUtils中找到了一个stripAccents形式的解决方案,该解决方案从字符串中删除了diacities。
val str = stripAccents("téléphone")
println(str)
这将产生"电话"。希望这能帮助到别人!
您可以使用它,创建一个函数来返回stripAccents
的值。
val spark=SparkBase.getSparkSession()
val sc=spark.sparkContext
import spark.implicits._
val str = stripAccents("téléphone")
println(str)
val str2 = stripAccents("SERNAQUE ARGÜELLO NORMA ELIZABETH")
println(str2)
case class Fruits(name: String, quantity: Int)
val sourceDS = Seq(("YÁBAR ARRIETA JENSON", 1), ("SERNAQUE ARGÜELLO NORMA ELIZABETH", 2)).toDF("text","num")
val check = udf((colValue: String) => {
stripAccents(colValue)
})
sourceDS.select(col("text"),check(col("text"))).show(false)
->输出
+---------------------------------+---------------------------------+
|text |UDF(text) |
+---------------------------------+---------------------------------+
|YÁBAR ARRIETA JENSON |YABAR ARRIETA JENSON |
|SERNAQUE ARGÜELLO NORMA ELIZABETH|SERNAQUE ARGUELLO NORMA ELIZABETH|
+---------------------------------+---------------------------------+