Sqoop提供的--fields-terminated-by选项可以支持指定自定义的分隔符,但是它只支持单字节的分隔符,对于我们特殊的需求:希望使用双字节的“<-T->”,默认的是不支持的。
Sqoop在进行每一次的导出任务时,都会调用codegen,生成一个java文件,并编译打包成一个jar,供MapReduce使用。这个java文件包装了一系列的对导出数据的访问接口,我们可以尝试通过对这个java文件进行分析,找到指定双字节分隔符的方法。
一般地,如果是使用的--query用查询语句获取数据,生成的文件为QueryResult.java,QueryResult.jar,如果使用的是--table,则用指定的表名对相应文件命名。java文件生成在sqoop脚本的同一目录下。
1.修改QueryResult.java文件
生成QueryResult.java到 /home/ncms/sp/sqoopjar2目录中
sqoop codegen --connect jdbc:mysql://192.168.0.1:3306/admin --username admin --password admin --query "SELECT i.*,c.description FROM PUBLISH_INFO i INNER JOIN PUBLISH_CONTENT c
ON i.id=c.id where \$CONDITIONS " --bindir /home/ncms/sp/sqoopjar2 --class-name QueryResult --outdir /home/ncms/sp/sqoopjar2
public String toString(DelimiterSet delimiters, boolean useRecordDelim) {
StringBuilder __sb = new StringBuilder();
String fieldDelim ="<-T->"; //行分隔符同理,在该方法尾部 修改追加为 __sb.append("<-L->") 即可 ;
__sb.append(FieldFormatter.escapeAndEnclose(id==null?"null":"" + id, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(IS_STRUCTURED==null?"null":IS_STRUCTURED, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(is_deleted==null?"null":"" + is_deleted, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(last_modify==null?"null":"" + last_modify, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(table_name==null?"null":table_name, delimiters));
__sb.append(fieldDelim);
__sb.append(FieldFormatter.escapeAndEnclose(table_name2==null?"null":table_name2, delimiters));
2.打jar包
网上找的资料不全,而且比较麻烦,我使用简单方法(针对hadoop2.*)。
a.通过eclipse打jar包 建立QueryResult项目,一个QueryResult.java文件,将 hadoop2.*中的share中jar包和sqoop1.4.1.jar 导入。使用QueryResult.java提示找不到jar包为止。
b.通过eclip打jar包。
注意这一步 , jar包完成
3.运行命令,即可
注意: 我是将 QueryResult.jar放置当前目录下执行的,其他目录没有测试。
sqoop import --connect jdbc:mysql://192.168.0.1:3306/admin --username admin --password admin --query "SELECT * FROM PUBLISH_INFO where \$CONDITIONS " -m 1 --target-dir /sqoop/test232 --class-name QueryResult --jar-file QueryResult.jar
4.验证结果