BigQuery自定义UDF移除字符串重音/变音符号失效问题咨询
问题产生原因
- BigQuery 提供的 JavaScript UDF 运行环境对 ES6 的
String.prototype.normalize()方法兼容性不足,多数场景下该方法不会生效,无法将带重音的 Unicode 字符拆分为「基础字符 + 独立变音符号」的 NFD 编码形式,后续针对变音符号区间的正则替换自然无法命中目标字符。 - 即使个别版本环境支持
normalize方法,BigQuery 向 JS 运行时传递字符串时会预先做编码处理,也可能导致拆分后的变音符号不在\u0300-\u036f匹配范围内,造成替换失效。
解决方案
优先使用 BigQuery 原生 SQL 函数实现该逻辑,完全避开 JS UDF 的兼容性问题,执行效率也更高:
CREATE OR REPLACE FUNCTION project.remove_accent(x STRING) RETURNS STRING AS ( REGEXP_REPLACE(NORMALIZE(x, NFD), r'[\u0300-\u036f]', '') );
测试该函数:
SELECT project.remove_accent("éàçèñ")
返回结果为eacen,符合预期。
如果必须使用 JS UDF 实现,可以引入兼容版的 Unicode 规范化 polyfill 到 UDF 代码中,替代原生normalize方法即可,不过整体复杂度和执行性能都不如原生 SQL 方案。
内容的提问来源于stack exchange,提问作者Jason Tragakis
相关产品推荐
相关产品推荐

