Sqoop简介

 

  • Sqoop将用户编写的sqoop命令翻译为MR程序,MR程序读取关系型数据库中的数据,写入到HDFS或读取HDFS上的数据,写入到关系型数据库

  • 在MR程序中如果要读取关系型数据中的数据,必须制定输入格式为DBInputformat

  • 在MR程序中如果要向关系型数据吸入数据,必须制定输出格式为DBOutputformat

  • Sqoop命令运行的MR程序,只有Map阶段,没有reduce阶段。只需要数据传输,不需要对数据进行合并和排序

 

Sqoop导入数据1导入到HDFS

全表导入

 

Sqoop参数的配置及使用方法_hive

 

使用sqoop关键字筛选查询导入数据

 

Sqoop参数的配置及使用方法_hive_02

 

使用查询语句导入

 

Sqoop参数的配置及使用方法_hdfs_03

 

注意:

  1. 如果使用了–query,就不能指定–table,和–columns和–where

  2. –query 和 –table一定不能同时存在!

  3. –where和–query同时存在时,–where失效

  4. –columns和–query同时存在时,–where无效!

  5. –query 必须跟–target-dir

2导入到HIive

Sqoop参数的配置及使用方法_hdfs_04

原理还是分俩步:先把数据从关系数据库里导到hdfs中,然后再从hdfs中导到hive中,此时hdfs中的文件会被删除注意:如果hive中没表会自动创建表,但是类型是自动生成的,所以还是建议手动创建


先导入hdfs

 

Sqoop参数的配置及使用方法_数据_05

 

利用  load data  命令导入hive

  • Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。

  • 在导出数据时采用–input-null-string–input-null-non-string两个参数。

  • 导入数据时采用–null-string–null-non-string

3导入到HBase

 

Sqoop参数的配置及使用方法_数据_06

 

当选用自动创建表时,如果版本不兼容会报错:

  •  
20/03/24 13:51:24 INFO mapreduce.HBaseImportJob: Creating missing HBase table t_empException in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V

 

Sqoop参数的配置及使用方法_hdfs_07

 

此时只能自己手动创建或者可以重新编译sqoop源码

如果要多列族导入,只能多次运行命令,一次导入一个列族

 

Sqoop导出1表为空时

 

Sqoop参数的配置及使用方法_hive_08

2表不为空时如果插入的数据的主键和表中已有数据的主键冲突,那么会报错Duplicate entry '5' for key 'PRIMARY' 

在mysql中

 

Sqoop参数的配置及使用方法_hive_09

 

指定当插入时,主键重复时时,对于重复的记录,只做更新,不做插入!

而用sqoop时,则可以启用以下俩种模式

 

updateonly模式

 

Sqoop参数的配置及使用方法_sqoop_10

利用 –update-key 字段  ,表示主键重复时会进行更新,但是主键不重复的时候,数据不会插入进来

allowinsert模式

 

Sqoop参数的配置及使用方法_数据_11

 

表示主键重复时会进行更新,主键不重复的时候,数据也会插入进来

 

Sqoop参数的配置及使用方法_hive_12