Sqoop是用来进行数据导入导出的工具,一般用在hadoop这个框架中,常用的应用场景有将mysql数据库中的数据导入HDFS或者Hive、Hbase,或者从后者中导出到关系型数据库中,下面将进行几段代码的演示导入和导出的过程。


将mysql中的数据导入到hadoop集群上(HDFS):


首先将脚本命令贴出:

./sqoop import --connect jdbc:mysql://localhost/test --username root --password lakers  --table persons -m 1

故名思议,

username:数据库的用户名

password:用户名对应的密码

table:数据中需要导入的表名

-m :启动mapreduce的个数。

这里实现的是将一个表(test)的全部数据导入到hdfs中,其中可以设置导入到hdfs的路径 通过参数--target-dir <dir>设置,其他的还有很多的参数设置可以通过去官网查看:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_importing_data_into_hive_2


将test表中的某些数据导入到HDFS中:

./sqoop import --connect jdbc:mysql://localhost/test --username root --password lakers  --query 'select ID,name from persons where $CONDITIONS' --target-dir /persons -m 1


将mysql数据导入Hive:


传统地将mysql中的数据导入hdfs有中方法就是:

1 将mysql数据导出到本地

2 在Hive中创建表格式

3 将导出在本地的数据导入到Hive中


但是用了sqoop之后我们可以一步完成上面的操作。


首先将mysql的数据导入到Hive上,其实也是导入到hdfs上,但是有个好处是我们可以直接通过Hive去处理数据,得到我们想要的结果,下面的shell脚本和上面的脚本很相似。


./sqoop import --connect jdbc:mysql://localhost/test --username root --password lakers  --table persons -m 1 --hive-import


   这里有个需要说明的是,我们将mysql数据导入到Hive中的时候是不需要去创建表,在导入过程中sqoop会自动解析数据,帮我们创建对应格式的表结构。这里不得不说省了很大的功夫,毕竟创建表结构很麻烦的,尤其是表字段很多的情况下。


和上面的区别就是最后加了--hive-import 同时也是可以通过参数来设置导入的目录,从官网查询。


Mysql中数据导入到HBase:


./sqoop import --connect jdbc:mysql://localhost/test --username root --password lakers  --table persons -m 1 --hbase-create-table --hbase-table person2 --column-family info --hbase-row-key sid


--hbase-create-table :自动创建hbase表

--hbase-table :表明

--column-family:列簇名

--hbase-row-key:指定rowkey对应Mysq中的键


  注:目前还不能直接将HBase中数据直接导出到Mysql中,可以先导出到本地,然后再导入Mysql



将Hive中的数据导出到mysql中:


./sqoop export --connect jdbc:mysql://localhost/test --username root --password lakers -m 1 --table personcopy --export-dir /hive/warehouse/persons --input-fields-terminated-by '\0001'



--export-dir:导出数据的目录

--input-fileds-terminated-by : 字段之间的分割符


注意:

     这里需要注意的是,我们在从mysql导入Hive中的时候是不需要创建表结构的,但是我们在将Hive的数据导出到Mysql中的时候是需要自己创建表结构的,很简单的原因,比如我们Mysql 的一个varchar(50)或者varchar(60)这种会自动在Hive中解析为String类型,但是相反的是,将Hive中的String类型导入到Mysql中就不知道是解析为varchar(?),所以在这个时候我们需要手动的去创建对应的表结构!