利用Sqoop把Oracle数据迁移到HDFS、Hive

提示:以下操作是在Xshell终端进行的,导入数据后若在Xshell终端上查看导入的数据,数据中的中文会出现乱码。要在Linux系统(最好是在可视化的Linux系统端)中去查看数据不会出现乱码。本人刚开始一直都是在Xshell上进行数据的导入、查看测试,花了一天时间解决“乱码”情况都没解决,最后才知是Xshell终端的问题,这里提示一下。

一、利用Sqoop,从Oracle到HDFS

第一步:把Oracle驱动拷贝到Sqoop安装路径中的lib文件夹下。

利用Ambari搭建Hadoop集群,各组件默认安装在/usr/hdp/目录下)

第二步:切换账户su hdfs

第三步:执行import操作

sqoop import --connect jdbc:oracle:thin:@IPAddress:databaseName --username userName --password password --table TABLENAME --target-dir /user/operate -m 1 --where "where子句 and 根据需要添加"

说明:

1、导入的目录若已经存在则要先删除已经存在的目录,否则会报路径以存在的错误提示:

FileAlreadyExistsException: Output directoryhdfs://master:8020/user/operate already exists

删除路径语句:hadoop fs –rmr /user/operate

如果多次导入同一个表中的数据,数据要以append的形式插入到HDFS目录中。

2、-m 1表示使用几个map任务处理,sqoop默认采用4个map任务,有几个任务在HDFS中执行结果中就有几个part-m文件;若m值不等于1,则导入的表需要有主键,否则会报错:

Error during import: No primary key could befound for table KW_CARENLIST. Please specify one with --split-by or perform asequential import with '-m 1'.

sqoop是根据--splite-by <字段名>进行分区,--m设置map的数量,sqoop根据不同的splite参数进行切分,然后将切分出来的区域分配到不同的map中。Splite-by的参数类型不同则其切分方法不同,如int型,sqoop会取最大和最小splite-by字段。Sqoop会向关系数据库发送一个命令;select max(id),min(id) from table,然后会把max、min之间的区间平均分成m份,最后m个并行的map会执行任务。--splite-by认是主键,如果操作的表没有主键导入时会报错。splite-by对非数字类型的字段支持不好,一般用于主键及数字类型的字段(对于非数字类型有可能会导致数据量丢失。如:a,b,c,d,e,a,a,v,f,g)。在实例测试中,要导入的Oracle一张表(200多万条数据)中没有关键字,若以数据表的最后一列(NUMBER类型,值存在null,存在重复值)为splite-by对象,则最终检验导入的数据只有100多万条。

3、Sqoop默认从数据库导入到HDFS的分隔符是逗号,可用—field –terminated-by 来指定输出文件中的行字段分隔符。如果导入数据的字段内容中存在分隔符,可以另外指定父、字段包围符和转转义字符。

4、空列的值使用null。Sqoop默认导入的数据格式为文本文件。另可导入其他几种文件格式,如SequenceFile、Avro格式。文本文件不能保存二进制字段(如数据库中类型为VARBINARY的列),且在区分null值和null字符串时可能出现问题。Avro和SequenceFile格式的文件能够为导入的数据提供最精确的表示方式,同时还允许对数据进行压缩,并支持MapReduce并行处理同一文件的不同部分。(不过目前版本还不能将Avro或Sequence文件加载到Hive中,尽管可以手动地将Avro数据文件加载到Hive中)。SequenceFile文件格式的最后一个缺点是它只支持Java语言,而Avro数据文件却可以被很多语言支持。

5、Sqoop中的map数设置原则:一个表的数据抽取不超过3分钟,否则就增加map数。

辅助操作:

查看路径下文件:hadoop fs -ls /user/operate/

打开指定文件:hadoop fs –cat/user/operate/tabe_name

统计文件中行数:hadoop fs –cat /路径/文件名 |wc –l

二、利用Sqoop,从Oracle到Hive

访问 Hive数据库:

第一步:在root账户下切换到hive用户

第二步:进入到hive命令行


测试HSQL,可跳过。
创建数据库简单命令:


这里的test数据名是小写,大写的会出错。

第三步:直接导入Hive数据库

sqoop import --connect jdbc:oracle:thin:@IPAddress:1521:databaseName --username userName --password password --table TABLENAME  -m 1 --hive-import --hive-database test

相比导入到HDFS中,添加了—hive-import 、–hive-database参数。

--hive-import指定导入方式是导入到hive数据库中

--hive-database指定导入的目标数据库test,若无此参数则默认导入到Hive的默认数据库default中。

上面的导入结果是导入到了test.test_table中,Hive自动创建了一张与Oracle导入表一样的表。也可以自己创建表,指定自己的表名:--hive-table tbName。

注意:因Oracle、Hive数据类型的不一致,导入的数据会存在精度减低的问题。

查看导入结果:

hive>select * from test.test_table;


该操作是在Xshell客户端进行的,可以看到上图中第三行的中文出现了乱码,这也是在文章开始部分提到的现象。在Linux系统命令行(可视化操作系统)下则正常。


也可以使用--option-file传入一个文件,使用这种方式可以重用一些配置参数(该方法为测试,看起来不错,做下记录,有兴趣的可以baidu一下):

$ sqoop –option-file /user/hive/import.txt –table test.table
其中,/user/hive/import.txt文件内容如下:
import --connect jdbc:oracle:thin:@IPAddress:1521:databaseName --username userName --password password --table TABLENAME --target-dir /user/hive/ -m 1
辅助操作:

删除数据库:DROP DATABASE IF EXISTS test;

删除数据库表:DROP TBALE test.test_table;

退出hive命令行:exit;



  • 4
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值