`

sqoop-javabean-sqoop脚本分隔符失效问题

 
阅读更多



  

 a 介绍背景:

这边我的sqoop抽数流程是这样

1 将关系库对应表通过sqoop导出成javabean

2 将javabean在eclipse中针对字段做一些预处理,比如日期字段为Null下设置初始值

3 将处理好的javabean打包,后通过sqoop将关系数据库数据导出时指定这个包和对应类即可

 

这样做的目的是在导数的过程中,sqoop借助hadoop的力量将原数据做初始化处理后倒入到hdfs

 

 

b sqoop将关系型数据表导出成javabean:

 

sqoop codegen --connect jdbc:oracle:thin:@192.168.201.28:1521:orcl --username SHANGBIAO --password 123456 --table F_TM_TRADEMARK  --class-name com.chinadaas.gsinfo.sqoop.oracle.F_TM_TRADEMARK  --outdir /opt/sqoopbean

 语句执行后,生成的文件夹层次为

com.chinadaas.gsinfo.sqoop.oracle.F_TM_TRADEMARK 

生成到linux目录的/opt/sqoopbean下

 

c 对应javabean代码贴出如下

 

   注意1:将对应导出的javabean放在eclipse后,在方法readFields(ResultSet __dbResults)内针对每个字段对需要的预处理,然后将工程打成jar包,供d流程处理。

 

public class F_TM_PROCESS extends SqoopRecord  implements DBWritable, Writable {

........

public void readFields(ResultSet __dbResults) throws SQLException {
    this.__cur_result_set = __dbResults;
    
    this.MARKCODE = JdbcWritableBridge.readString(1, __dbResults);
    this.MARKCODE = BasicOperation.strFormat(this.MARKCODE);
    
    this.MARKCODE_KEY = JdbcWritableBridge.readString(2, __dbResults);
    this.MARKCODE_KEY = BasicOperation.strFormat(this.MARKCODE_KEY);

   .......

}

 .......

private final DelimiterSet __outputDelimiters = new DelimiterSet((char) 9, (char) 10, (char) 0, (char) 0, false);   

}


public class BasicOperation {  
	public static String strFormat(String value) {
		if (value == null)
			return "";

		value = value.replaceAll("\r|\n", " "); // 替换回车、换行
		value = value.replaceAll("\u0001", ""); // 替换标题开始
		value = value.trim();

		return value;
	}
                  .....
}

 

 

 注意2:通过 sqoop import --jar-file  --class-name  方式导出oracle数据到hdfs的时候,因为带有了

 --jar-file  --class-name  ,所以--fields-terminated-by '\t' 方式是不生效的,(注意如果没有--jar-file  --class-name   则不会出现),这点可以查看生成的javabean的代码:

这时候已经把分隔符写死成,

private final DelimiterSet __outputDelimiters = new DelimiterSet((char) 44, (char) 10, (char) 0, (char) 0, false);

 

 

因此需要在javabean中修改上述代码,比如你的实际表字段中含有 空格或者, 不能使用默认的,作为分隔符写到hdfs上,想以 \t 那么就需要修改成:

 

private final DelimiterSet __outputDelimiters = new DelimiterSet((char) 9, (char) 10, (char) 0, (char) 0, false); 

 

这样,oracle的字段写到hdfs上后字段间隔就变成了\t
此时可以将javabean所在的工程导出成Jar后在通过jd-gui.exe 反编译查看你的 \t是否已经展示,
如下图是我修改后的:


 
 

 

 

sqoop import \
--connect $ORCL_CONNECTOR \
--username $ORCL_USERNAME \
--password $ORCL_PASSWORD \
--table $TABLENAME \
--target-dir $HDFSPATH \
--m $MAP \
--columns $COLUMNS \
--fields-terminated-by '\t' \   
--jar-file ../../lib/sqoop-import.jar \
--class-name com.chinadaas.gsinfo.sqoop.oracle.$TABLENAME

 

导出到hdfs后,通过hive创建外表关联hdfs的写法如下:

 

drop table if exists F_LIUCHENG_TMP_HDFS_EXT_20150717;
create external table F_LIUCHENG_TMP_HDFS_EXT_20150717 (
MARKCODE string, MARKCODE_KEY string, UNIONTYPECODE string, XIANGMU string, LIUCHENGDATE string, CREATEDATE string, ISDELITEM string, REMARK string, HASDOWN string, FLIUC_IDT string, FLIUC_UDT string, FLIUC_STATUS string, FLIUC_ID string, FLIUC_SID string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
LOCATION '/tmp/oracle_20150717/F_LIUCHENG_TMP';

 

 

这样,sqoop导出的字段就和hive的字段关联起来,数值也会一一对应.

 

其中, char码值对应大全参考链接如下: char码值对应列表大全

 

 d sqoop从oracle倒数的时候 oracle的用户名必须大写,否则会报错如下:

 

报错为:  
15/08/12 19:12:40 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.IllegalArgumentException: Attempted to generate class with no columns!  
java.lang.IllegalArgumentException: Attempted to generate class with no columns!  
        at org.apache.sqoop.orm.ClassWriter.generateClassForColumns(ClassWriter.java:1273)  
        at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1153)  
        at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:82)  
        at org.apache.sqoop.tool.CodeGenTool.run(CodeGenTool.java:99)  
        at org.apache.sqoop.Sqoop.run(Sqoop.java:145)  
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)  
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)  
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)  
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)  
        at org.apache.sqoop.Sqoop.main(Sqoop.java:238)  
   
导数的时候出错: ERROR tool.ImportTool: Imported Failed: Attempted to generate class with no columns!  

 

通过sqoop导出的 F_TM_TRADEMARK.java 见附件

 

  • 大小: 75.2 KB
分享到:
评论

相关推荐

    sqoop-1.4.6-cdh5.13.2.tar

    mv /usr/local/sqoop-1.4.6-cdh5.13.2/conf/sqoop-env.template.sh /usr/local/sqoop-1.4.6-cdh5.13.2/conf/sqoop-env.sh vi /usr/local/sqoop-1.4.6-cdh5.13.2/conf/sqoop-env.sh export HADOOP_COMMON_HOME=/usr/...

    Sqoop-sqlserver-hdfs.rar

    在这个"Sqoop-sqlserver-hdfs.rar"压缩包中,我们有两个关键文件:sqljdbc.jar和sqoop-sqlserver-1.0.tar.gz,它们是实现SQL Server到HDFS数据迁移的关键组件。 首先,`sqljdbc.jar`是Microsoft提供的Java驱动程序...

    sqoop-1.4.7.bin__hadoop-2.6.0.tar

    这个压缩包 "sqoop-1.4.7.bin__hadoop-2.6.0.tar" 包含了 Sqoop 的 1.4.7 版本,该版本是针对 Hadoop 2.6.0 的。对于那些不想通过官方网站下载的用户,这是一个方便的选择。 在 Hadoop 生态系统中,Sqoop 提供了一...

    sqoop-1.4.7.jar

    sqoop框架开发工具使用的jar sqoop-1.4.7.jar 手动安装到maven <groupId>org.apache.sqoop <artifactId>sqoop <version>1.4.7 </dependency>

    sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.zip

    这个压缩包 "sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.zip" 包含了 Sqoop 1.4.6 版本,该版本是为 Hadoop 2.0.4-alpha 版本定制的。Sqoop 的主要功能是让大数据分析师和开发人员能够方便地导入和导出数据,它弥补了...

    sqoop-1.4.6.jar.zip

    sqoop框架开发工具使用的jar sqoop-1.4.6.jar 手动安装到maven <groupId>org.apache.sqoop <artifactId>sqoop <version>1.4.6 </dependency>

    sqoop-1.4.6.bin__hadoop-2.0.4-alpha.zip

    这个压缩包 "sqoop-1.4.6.bin__hadoop-2.0.4-alpha.zip" 包含的是Sqoop 1.4.6版本,针对Hadoop 2.0.4-alpha版本优化的二进制发行版。 **Sqoop 的核心功能:** 1. **数据导入**:Sqoop 提供了命令行接口,可以将结构...

    sqoop-1.4.4-cdh5.0.6.tar

    `sqoop-1.4.4-cdh5.0.6.tar` 是 Cloudera Distribution 包含 Hadoop(CDH)的一个特定版本的 Sqoop 发行版。 1. **Sqoop 的核心功能**: - 数据导入:Sqoop 可以自动创建 MapReduce 任务,将数据库表的数据分片并...

    sqoop-1.4.6-cdh5.5.0.tar.gz

    安装 Sqoop 时,通常我们会下载类似 "sqoop-1.4.6-cdh5.5.0.tar.gz" 的压缩包。这个文件包含了 Sqoop 源代码、库文件、配置文件等所有必要组件,用于在 CDH 集群上构建和部署 Sqoop。解压这个压缩包后,我们可以通过...

    sqoop-1.4.2.bin__hadoop-2.0.0-alpha.tar

    这个压缩包 "sqoop-1.4.2.bin__hadoop-2.0.0-alpha.tar" 提供的是 Sqoop 1.4.2 版本,适用于与 Hadoop 2.0.0-alpha 版本集成。以下是对这个版本 Sqoop 的详细介绍以及相关的知识点: 1. **Sqoop 的作用**:Sqoop 是...

    sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz

    这个压缩包 "sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz" 包含了 Sqoop 的 1.4.6 版本,它已针对 Hadoop 2.0.4-alpha 版本进行了优化。让我们深入了解一下 Sqoop 的核心功能、工作原理以及如何在 Hadoop 环境中...

    sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar

    《全面解析:Sqoop-1.4.5在Hadoop-2.0.4-alpha环境下的安装与使用》 Sqoop是一款开源的数据迁移工具,它主要用于在关系型数据库(如MySQL、Oracle等)和Hadoop之间进行数据的导入导出。在大数据处理中,Sqoop扮演...

    sqoop-1.4.7(可直接下载学习使用)附有安装配置教程!

    内容概要:Sqoop 1.4.7 安装包主要包括以下内容:Sqoop 命令行工具:用于执行数据迁移任务的客户端工具。连接器:Sqoop 支持多种数据库连接器,包括 MySQL、PostgreSQL、Oracle 等,用于连接目标数据库。元数据驱动...

    sqoop-common-1.99.7.jar

    sqoop-common-1.99.7.jar sqoop-common-1.99.7.jar sqoop-common-1.99.7.jar

    sqoop-1.4.6.bin-hadoop-2.0.4-alpha版本的压缩包,直接下载到本地,解压后即可使用

    Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,...

    sqoop-connector-generic-jdbc-1.99.7.jar

    sqoop-connector-generic-jdbc-1.99.7.jar sqoop-connector-generic-jdbc-1.99.7.jar

    sqoop-1.4.6.bin__hadoop-2.0.4-alpha安装包

    Sqoop是一个用于在Hadoop和关系数据库或大型机之间传输数据的工具。您可以使用Sqoop将关系数据库管理系统(RDBMS)中的数据导入Hadoop分布式文件系统(HDFS),转换Hadoop MapReduce中的数据,然后将数据导出回RDBMS...

    sqoop-sqlserver-1.0.tar.gz

    这个名为 "sqoop-sqlserver-1.0.tar.gz" 的压缩包文件,显然包含了针对 SQL Server 的特定连接器,使得 Sqoop 能够更有效地将数据导入到或导出自 Microsoft SQL Server 数据库。 Sqoop 是 Hadoop 生态系统中的重要...

    sqoop-1.4.6-cdh5.12.0.tar.gz

    在本例中,我们讨论的是 Sqoop 的一个特定版本——"sqoop-1.4.6-cdh5.12.0.tar.gz",它是为 Cloudera Data Hub (CDH) 5.12.0 版本设计的。确保 Sqoop 版本与 CDH 组件版本兼容至关重要,因为不同版本的 Sqoop 可能...

Global site tag (gtag.js) - Google Analytics