sqoop自定义字符串分隔符

    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.验证结果







猜你喜欢

转载自houston123.iteye.com/blog/2261073