【发布时间】: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"))
如果我可以只替换这些 unicode 字符串的前 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