sqoop2 去除单引号与自定义分隔符
来源:互联网 发布:淘宝口红代购 编辑:程序博客网 时间:2024/05/17 06:08
正在做oracle到hive的数据导入,遇到数据分隔问题,sqoop2 默认分隔式逗号,我使用hive 也是逗号分隔,发现数据中含有逗号的字段,hive把它分成了好几个。于是去网上找自定义分隔的解决方法,但是无奈这方面的资料很少。不解决此问题,工作无法进行。胜了最后一个法宝,编译源码。
2、去下载跟你使用的一个版本的sqoop2 源码(最好),使用maven构建,(注意,打包时最好跳过test,进行编译,不然可能会报错)
3、修改代码:
定位:应为是写到hdfs上,所谓我认识应该写该hdfs-connector的代码,发现代码中有定义默认分隔符的,把它改成 制表符,编译->上传后,发现结果没有改变。接着思考,发现类:org.apache.sqoop.connector.hdfs.hdfsWriter.HdfsTextWriter下有个write方法,并且有个HdfsConstants.DEFAULT_RECORD_DELIMITER(每行的记录的默认分隔),
这个是每个记录以逗号分隔的的数据,现在要写个方法将其分开(把单引号作为一种标志把,字段的逗号跟非分隔符逗号分开)
4、下面是以逗号分隔改为以 ‘\t’分隔的代码(org.apache.sqoop.connector.hdfs.hdfsWriter.HdfsTextWriter整个类)
package org.apache.sqoop.connector.hdfs.hdfsWriter;import com.google.common.base.Charsets;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.compress.CompressionCodec;import org.apache.sqoop.connector.hdfs.HdfsConstants;import java.io.BufferedWriter;import java.io.DataOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;public class HdfsTextWriter extends GenericHdfsWriter { private BufferedWriter filewriter; @Override public void initialize(Path filepath, Configuration conf, CompressionCodec codec) throws IOException { FileSystem fs = filepath.getFileSystem(conf); DataOutputStream filestream = fs.create(filepath, false); if (codec != null) { filewriter = new BufferedWriter(new OutputStreamWriter( codec.createOutputStream(filestream, codec.createCompressor()), Charsets.UTF_8)); } else { filewriter = new BufferedWriter(new OutputStreamWriter( filestream, Charsets.UTF_8)); } } @Override public void write(String csv) throws IOException { filewriter.write(transfer(csv) + HdfsConstants.DEFAULT_RECORD_DELIMITER); } @Override public void destroy() throws IOException { filewriter.close(); } private String transfer(String csv){String words[]=csv.split(",");StringBuffer sb=new StringBuffer();boolean flag1=false;boolean flag2=false;boolean flag3=false;String temp="";for (int i = 0; i < words.length; i++) {if(words[i].equalsIgnoreCase("NULL")){words[i]="-1";}flag1=words[i].startsWith("'");flag2=words[i].endsWith("'");if(flag1&&flag2){sb.append(words[i]);sb.append('\t');}else if(flag1&&!flag2){temp=words[i]+",";flag3=true;}else if(!flag1&&flag2){temp=temp+","+words[i];flag3=false;sb.append(temp);sb.append('\t');}else{if(flag3){temp=temp+words[i];}else{sb.append(words[i]);sb.append('\t');}}}return sb.toString().replace("'", "").trim();//return sb.toString().trim();}}
5、打包,及上传到sqoop2文件夹/webapps/sqoop/WEB-INF/lib(或许由于版本不一样而有差别,请选择connector所在的文件夹),在上传之前要把hdfs-connector,mv 到其他文件夹(为了保险),也可以删掉(不建议),也可以把hdfs-connector里的名字改掉(未试验),重启sqoop2。执行任务看看效果。
6、完成。
- sqoop2 去除单引号与自定义分隔符
- Sqoop1 与 Sqoop2
- 数据库插入单引号,数组分隔符的山寨法
- hive-TextInputformat自定义分隔符
- sqoop1.99.7自定义分隔符
- Sqoop2的安装与使用
- 【SQL分享】去除字符串中连续的分隔符【经典】
- Hadoop Pig、Hive 自定义输入输出分隔符
- Hadoop Pig、Hive 自定义输入输出分隔符
- mapreduce 自定义key/value 输出分隔符
- mapreduce 自定义key/value 输出分隔符
- 超详细讲解Sqoop2应用与实践
- Sqoop2 MySQL与HDFS导入导出
- UITableView 分隔线的自定义方法(可自定义分隔线的颜色 粗细 与屏幕边缘的距离)
- mysql去除特殊字符 单引号(‘)
- tableView 自定义分隔线
- 4java分隔符与变量
- C++ -windows与unix路径分隔符
- Linux学习笔记(二十四、VI编辑器概述)
- UIViewController的生命周期
- php实现mysql备份
- 【Web】表单中使用post和get的区别
- 从原理剖析自动拆装箱
- sqoop2 去除单引号与自定义分隔符
- 香橙派 orangepi 配置WPA2 无线网络
- zhphp framework(二十一) file 文件类
- jbpm4.4生成18张数据库表
- php 算取两个时间的所有月份
- POJ3067 Japan
- zhphp framewrok (二十二) file cache 文件缓存类
- Spring Boot 属性配置和使用
- HDU 2095 find your present (2)