scala 在Spark列/ Dataframe上编写自定义Spark函数

lnvxswe2  于 2023-01-13  发布在  Scala
关注(0)|答案(2)|浏览(168)

我想通过删除重音符号来规范化作者姓名

Input:  orčpžsíáýd
Output: orcpzsiayd

下面的代码将允许我实现这一点。然而,我不知道我如何才能做到这一点使用Spark函数,我的输入是 Dataframe 列。

def stringNormalizer(c : Column) = (
    import org.apache.commons.lang.StringUtils
    return StringUtils.stripAccents(c.toString)
)

我应该可以这样称呼它

val normalizedAuthor = flat_author.withColumn("NormalizedAuthor",      
stringNormalizer(df_article("authors")))

我刚刚开始学习Spark。所以请让我知道是否有一个更好的方法来实现这一点没有UDF。

vngu2lb8

vngu2lb81#

它需要一个udf:

val stringNormalizer = udf((s: String) => StringUtils.stripAccents(s))

df_article.select(stringNormalizer(col("authors")))
z18hc3ub

z18hc3ub2#

尽管看起来不那么漂亮,但我发现在没有UDF的情况下删除重音符号所需的时间减少了一半:

def withColumnFormated(columnName: String)(df: DataFrame): DataFrame = {
  val dfWithColumnUpper = df.withColumn(columnName, upper(col(columnName)))
  val accents: Map[String, String] = Map("[ÃÁÀÂÄ]" -> "A", "[ÉÈÊË]" -> "E", "[ÍÌÎÏ]" -> "I", 
                                         "[Ñ]" -> "N", "[ÓÒÔÕÖ]" -> "O", "[ÚÙÛÜ]" -> "U", 
                                         "[Ç]" -> "C")
  
  accents.foldLeft(dfWithColumnUpper){
    (tempDf, replace_element) => tempDf.withColumn(columnName,
                                                   regexp_replace(col(columnName),
                                                                  lit(replace_element._1),
                                                                  lit(replace_element._2)))
    }
  }

然后你可以这样应用它:

df_article.transform(withColumnFormated("authors"))

相关问题