Maxcompute数据同步时emoji表情过滤

本文介绍了一种解决DataX同步emoji表情至RDS时出现脏数据问题的方法。通过更改数据库字符集、调整同步脚本编码均未奏效后,最终采用Java编写UDF过滤emoji的方式实现了数据的完整同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

Q

工作中遇到ODPS数据同步至RDS的场景,数据中有emoji表情,同步任务(DataX)会把emoji表情标记为脏数据,然后跳过这条数据。如何将完整的数据同步完成?

A

1.更改rds数据库的字符集为utf8mb4:
我们的rds就是utf8mb4,但还是同步不过去。
2.更改同步脚本的encoding:
查看文档发现polarDB writer是通过jdbc链接rds for mysql 的,于是尝试更改jdbc的编码格式,但没有效果。也可能是语法格式问题,之前并不了解dataX脚本的语法。
3.过滤掉数据中的emoji:
改编码无果,时间紧迫,故开始尝试过滤掉emoji。起初是写sql,企图用正则表达式过滤,一步到位,但找了半天也没有能用的正则表达式。最后改用java语言写,创建UDF,终于过滤成功。
代码如下:

import com.aliyun.odps.udf.UDF;
import org.apache.commons.lang3.StringUtils;


public class EmojiFilter extends UDF {

    public boolean isEmojiCharacter(char codePoint) {
        return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
                || (codePoint == 0xD)
                || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
                || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
                || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
    }

    public String evaluate(String s) {
        String source = StringUtils.replace(s, s, " " + s);
        if (StringUtils.isBlank(source)) {
            return source;
        }
        StringBuilder buf = null;
        int len = source.length();
        for (int i = 0; i < len; i++) {
            char codePoint = source.charAt(i);
            if (isEmojiCharacter(codePoint)) {
                if (buf == null) {
                    buf = new StringBuilder(source.length());
                }
                buf.append(codePoint);
            }
        }
        if (buf == null) {
            return source.trim();
        } else {
            if (buf.length() == len) {
                buf = null;
                return source.trim();
            } else {
                return buf.toString().trim();
            }
        }
    }

}

代码源自这里:

Maxcompute创建UDF的方法:

  1. 下载 Maxcompute studio 插件
  2. 创建 MC项目
  3. 与maxcompute建立连接(Access ID和Key)
  4. 写代码(extends UDF)
  5. 打成带依赖的jar包
  6. 上传资源
  7. 创建UDF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值