regexp\u替换scala sparkDataframe中的部分unicode(emoji)

nimxete2  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(456)

我试着用Spark regexp_replace 替换unicode以开头的所有表情符号 \uD83D 并用 \uD83D ,但我运气不好。
举个例子:
我想以“?”(在scala中是 \uD83D\uDE02 )用“?”替换。使用一个表情符号就很容易了,并且可以使用以下代码:

.select(functions.regexp_replace($"text2", "[(\uD83D\uDE02)]", " \uD83D\uDE02").as("split2"))

在上面的代码中,如果在text2列中有这样一个字符串“???”,它将把它变成“???”,我就可以很容易地用空格分开。
我想把这个应用到所有以 \uD83D 所以我认为这样做应该管用,但事实并非如此:

.select(functions.regexp_replace($"text2", "[(\uD83D)]", " \uD83D").as("split2"))

这不会以任何方式影响数据。即使有或没有括号和/或方括号,以下内容也不会以任何方式影响数据:

.select(functions.regexp_replace($"text2", "[(u)]", " \uD83D").as("split2"))

如果我可以只替换这些unicode字符串的前6个字符,那么text2列中的以下内容将导致“?????”,这正是我需要的。
谢谢你的帮助!

iyfamqjs

iyfamqjs1#

你可以用这个正则表达式 \\B\uD83D.{1} 并替换为捕获的组 $1 还有空间。然后修剪以除去最后一个空格并拆分:

val df = Seq(
  ("????"),
  ("????")
).toDF("text2")

df.select(
  split(
    trim(regexp_replace($"text2", "(\\B\uD83D.{1})", "$1 ")),
    " "
  ).as("split2")
).show

//+-----------------+
//|          split2 |
//+-----------------+
//|[?, ?, ?, ?]|
//|[?, ?, ?, ?]|
//+-----------------+

相关问题