【问题标题】:Regexp_replace PART of unicode (emoji) in Scala-Spark dataframeScala-Spark 数据帧中的 unicode(表情符号)的 Regexp_replace PART
【发布时间】:2021-02-18 10:03:55
【问题描述】:

我正在尝试使用 spark regexp_replace 替换所有 unicode starts 的表情符号 \uD83D 并用 \uD83D 替换只是那部分 unicode,但我没有运气。

这是一个例子:

我想获取所有“????”的实例(在 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"))

如果我可以只替换这些 un​​icode 字符串的前 6 个字符,则 text2 列中的以下内容:“??????????????????”会导致“???? ?????? ?????? ????”,这正是我所需要的。

感谢您的帮助!

【问题讨论】:

  • 所以,你想 1) 检查每个字形和 2) 如果它是一个以 \uD83D 开头的表情符号,用空格括起来?然后在 Scala 中,它看起来像 """\P{M}\p{M}*+""".r.replaceAllIn(YOUR_STRING_HERE, m => if (m.group(0).startsWith("\uD83D")) s" ${m.group(0)} " else m.group(0) )。不过,不确定如何在 spark 中执行此操作,regexp_replace 似乎不支持将 lambda 作为替换参数。问题在于检测表情符号的开头。

标签: regex scala apache-spark unicode apache-spark-sql


【解决方案1】:

您可以使用此正则表达式 \\B\uD83D.{1} 并替换为捕获的组 $1 和空格。然后 trim 去掉最后一个空格并拆分:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2018-04-17
    相关资源
    最近更新 更多