db2 导出del文件,java代码转换字段分割符做数据清洗,上传hdfs ,完成del文件导入到hive

文章描述了一个在将大量DEL文件从DB2导入到Hive过程中遇到的字段分隔符不匹配的问题。由于DB2使用逗号作为字段分隔符,而Hive使用001,作者编写了一个Java程序来转换文件,将逗号替换为001,并处理包含双引号的字段。程序读取GBK编码的DEL文件,清洗后写入新文件,然后上传到HDFS,成功解决了数据导入问题。
摘要由CSDN通过智能技术生成

 在DB2数据库中,在导出DEL文件时,默认的字符分隔符是"、字段分隔符是, (逗号)。在hive中字段分割符是以‘001’,特殊空白字符分割。有个需求要将120G的del文件导入到大数据环境。如果将del导入db2,再用sqoop抽的话,就不用考虑文件中的分隔符问题。但是因为数据量很大,db2导入会报错。所以想办法直接put到hadoop上。上传完后,在hive表发现错列了,原因是db2字字符串类型的字段值会存在(逗号),并且值会有双引号。这里写了一个java程序,对del文件做处理,将字段分隔符转化成‘\001’,并去除双引号。

package utils;

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HiveDataETL {
    public static void main(String[] args) throws IOException {
        int line_num = 0;
        InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(args[0])), "gbk");
        OutputStreamWriter ots = new OutputStreamWriter(new FileOutputStream(new File(args[1])), "gbk");
        BufferedWriter bw = new BufferedWriter(ots);
        BufferedReader br = new BufferedReader(isr);

        String reg = "\".*?\"";
        Pattern compile = Pattern.compile(reg);
        Matcher matcher = null;
        String line = "";
        while ((line = br.readLine()) != null) {
            matcher = compile.matcher(line);
            line_num++;
            StringBuilder sb = new StringBuilder();
            int start = 0, end = 0;
            while (matcher.find()) {
                if (start == 0 & end == 0) {
                    sb.append(line, 0, matcher.start());
                } else {
                    sb.append(line, end + 1, matcher.start());
                }
                start = matcher.start();
                end = matcher.end();
                if (end == line.length())
                    sb.append(matcher.group(0).replace(",", "|||"));
                else
                    sb.append(matcher.group(0).replace(",", "|||") + ",");
            }
            if (end != line.length())
                sb.append(line.substring(end + 1));

            String result = sb.toString().replace(',', '\01')
                    .replaceAll("\"", "")
                    .replace("|||", ",");
            bw.write(result);
            bw.newLine();
            bw.flush();
        }

        bw.close();
        br.close();
        System.out.println("行数:" + line_num);
    }
}

最后在idea里打包,上传到服务器,执行java -jar XXXX。对del文件进行清洗转化。重新上传到hdfs,数据正常导入完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值