首页 > 其他分享 >MaxCompute中如何处理异常字符

MaxCompute中如何处理异常字符

时间:2023-06-14 15:05:12浏览次数:40  
标签:字符 name MaxCompute replace LENGTH Unicode 异常

背景

在处理数据时,当业务数据同步至MaxCompute后,会产生一些含异常字符的脏数据,比如字段中包含了一个不可见字符,在DataWorks中显示不出来,但在BI界面又会显示成其他字符,影响整体观感。这种情况,通常我们的解法是,将异常的字符洗掉,下面来介绍几种常见的处理异常字符的方法。

问题描述

定位

如下图,可以看到“异常name”和“正常name”的 length值 不同,多了个不可见字符,但是我们并不能看出来啥。后期做数据处理或数据展示可能成为一个难以定位的问题。

SELECT 
    name as 异常name,
    LENGTH(name) as 异常name长度,
    '北京'  as 正常name,
    LENGTH('北京') as 正常name长度
from tbl1 
where name RLIKE '北京';

结果:

MaxCompute中如何处理异常字符_大数据

小技巧
  • 我们可以通过在线Unicode编码转换工具,将数值粘贴过去,获取到对应的Unicode码。同理也可以获取其他异常字符的Unicode码,以便后续处理。
  • 输入异常 vs 正常的字符串,对比 Unicode 差异可以倒推不可见字符为“ \u200b”

MaxCompute中如何处理异常字符_DataWorks_02

解决方案

  • 定位到问题后,回顾数据清洗的常规方案,想办法把消掉这种不可见字符

方案

描述

备注

本case是否适用

trim()函数

常规的首尾不可见字符处理

适用首尾部的空格、tab、换行

Yes

replace()函数

定向剔除字符串

适用于单个待替换的字符,多个需要层层嵌套

Yes

正则替换函数

定向剔除一类字符串

通过正则匹配符,替换一类字符串

Yes

方案1:trim() - 替换

效果如下:

  • 利用 trim() 函数将数值中的异常不可见字符替换为正常空值字符(不可见字符可通过在线Unicode编码转换工具Unicode转中文复制一下)
SELECT 
    name as 异常name,
    LENGTH(name) as 异常name长度,
    trim(name,'')  as 正常name,
  LENGTH(trim(name,'')) as 正常name长度
from tbl1 
where name RLIKE '北京';

结果:

MaxCompute中如何处理异常字符_DataWorks_03

方案2:replace() - 替换

效果如下:

  • 利用 replace() 函数将数值中的异常不可见字符替换为正常空值字符(不可见字符可通过在线Unicode编码转换工具Unicode转中文复制一下)
SELECT 
 name as 异常name,
 LENGTH(name) as 异常name长度,
 replace(name,'','')  as 正常name,
 LENGTH(replace(name,'','')) as 正常name长度
from tbl1 
where name RLIKE '北京';

结果:

MaxCompute中如何处理异常字符_DataWorks_04

方案4:正则表达式 - 替换
  • 使用函数一层一层替换会比较麻烦,目前MaxCompute支持通过正则表达式匹配出异常的字符
  • 只要筛选出了带有异常的一部分字符,再处理就方便很多了
  • 例如上文中的不可见字符,Unicode码为“\u200b”,通过执行如下SQL
select id,name from tbl1 where name rlike '[\x{200b}]';

结果返回:

MaxCompute中如何处理异常字符_大数据_05

  • 此时如果再用regexp_replace()函数可以替换掉这一部分含不可见字符的数值
-- regexp_replace()函数
SELECT 
 name as 异常name,
 LENGTH(name) as 异常name长度,
 regexp_replace(name, '[\x{200b}]', '',0)  as 正常name,
 LENGTH(regexp_replace(name, '[\x{200b}]', '',0)) as 正常name长度
FROM tbl1;

结果:

MaxCompute中如何处理异常字符_数据处理_06

总结

针对于SQL中的不可见字符或者其他中文等异常字符,都可以使用方案3中的筛选方式筛出来,然后再做后续的替换或其他操作就可以了。

【MaxCompute 已发布免费试用计划,为数仓建设提速】新用户可 0 元领取 5000CU*小时计算资源与 100GB 存储,有效期 3 个月。  立即领取>>

欢迎各位开发者加入大数据计算 MaxCompute 社区立即加入

标签:字符,name,MaxCompute,replace,LENGTH,Unicode,异常
From: https://blog.51cto.com/u_15316473/6477080

相关文章

  • 15-1 shell脚本编程进阶字符串切片和高级变量
    一、显示字符的长度[root@centos8~]#str=`echo{a..z}|tr-d''`[root@centos8~]#echostrstr[root@centos8~]#echo$strabcdefghijklmnopqrstuvwxyz[root@centos8~]#name=刘进喜[root@centos8~]#echo${#name}3[root@centos8~]#echo${#str}26二、切片roo......
  • 清空字符串的空格
    /\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢?我们先来看下面一个例子:letname='yewenjun';letans=name.replace(/\s/g,'');//'yewenjun'letans2=name.replace(/\s+/g,'');//'yewenjun&......
  • 压测: wrk压测的lua脚本使用随机列表与字符串参数
    ......
  • 自己动手写编译器:使用NFA识别字符串
    在前面章节中我们构建了NFA状态机,现在我们看看如何使用它来识别给定字符串是否合法。首先我们先构造如下正则表达式对应的NFA,在input文件的表达式部分输入:({D}*\.{D}|{D}\.{D}*)这个表达式的目的是识别浮点数,用我们前面做好的代码生成的NFA状态机如下:  这里我们需要引入两个......
  • 解决docker中gitlab的ssh拉取代码需要密码异常的问题
    安装gitlab命令dockerrun--name='gitlab'-d--publish222:22--publish1443:443--publish18080:80--restartalways--privileged=true--volume/home/docker_mount/gitlab/config:/etc/gitlab--volume/home/docker_mount/gitlab/logs:/var/log/gitlab--v......
  • 字符串哈希算法
    问题描述考虑1044.最长重复子串(Hard),本题思路并不难,可以使用二分答案来解决,假设答案为mid,那么长度大于mid的子串在s中只会出现一次,否则至少出现两次。因此只需要考虑子串在s中的出现次数即可,比较直接的想法是使用key为string的unordered_map,然而unoredere_map......
  • 异常
    异常概述就是程序出现了不正常的情况。程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。注意:语法错误不算在异常体系中。Error:严重问题,通过代码无法处理。比如:内存溢出。Exception:称为异常类,它表示程序本身可以处理的问题。RuntimeException及其子类:运......
  • json字符串解析 多语言替换
    importlombok.extern.slf4j.Slf4j;importorg.apache.commons.collections4.MapUtils;importorg.apache.commons.lang3.StringUtils;importorg.springframework.beans.factory.annotation.Value;importjava.util.HashSet;importjava.util.List;importjava.util.M......
  • .NET指定图片地址下载并转换Base64字符串
    需求描述    需要调用第三方图片上传接口上传图片,对方图片格式只能接收Base64字符串。所以我们需要将系统服务器的图片通过Url下载下来,然后转换成Base64字符串。接下来我们将使用HttpClient类库下载图片并将其转换为Base64格式的字符串。代码示例///<summary>......
  • MySQL字符索引没用上问题
    某一天,接口突然502,运维同学说没有可用的PHP进程了,看监控说是这个接口夯住了,导致请求进不来,临时把这个接口给返回了200(PS:线上这个接口没有实际作用,所以这么操作了);给了慢查询的SQL,用explain看了下,发现竟然没有用到创建的索引,此时数据库的量有大概150万行,对SQL里where字段加了双引......