用sqoop导入数据到HIVE和HDFS中

891 阅读3分钟

一:sqoop数据的导入

1.使用sqoop将: mysql中的数据导入到HDFS(直接导入)

Step1、确定Mysql服务的正常开启

service mysql status

Step2、在Mysql中创建一张表

mysql> create database company

mysql> create table staff(

       id int(4) primary key not null auto_increment,

       name varchar(255) not null,

       sex varchar(255) not null);

mysql> insert into staff(name, sex) values('Thomas', 'Male');

Step3、使用Sqoop导入数据到HDFS

-1. 将mysql数据全部导入hdfs

bin/sqoop import \

--connect jdbc:mysql://hadoop102:3306/company \

--username root \

--password 123456 \

--table staff \

--target-dir /user/company \

--delete-target-dir \

--num-mappers 1 \      =   --m 1

--fields-terminated-by "\t"

//如果到这里结束,则默认存放在hdfs上路径为:/user/robot/staff/ ,默认数据用,逗号隔开
  • 2.查询mysql总部分数据导入hdfs中
$ bin/sqoop import

--connect jdbc:mysql://hadoop-senior01.itguigu.com:3306/company

 --username root

--password 123456

--target-dir /user/company

--delete-target-dir

--num-mappers 1

--fields-terminated-by "\t"

--query 'select name,sex from staff where id >= 2 and \$CONDITIONS;'

  • 3.也算查询导入,导入指定列    
$ bin/sqoop import

--connect jdbc:mysql://hadoop-senior01.robot.com:3306/company

--username root

--password 123456

--target-dir /user/company

--delete-target-dir

--num-mappers 1

--fields-terminated-by "\t"

--columns id, sex

--table staff
  • 4.细化筛选查询导入
$ bin/sqoop import

--connect jdbc:mysql://hadoop-senior01.robot.com:3306/company

--username root

--password 123456

--target-dir /user/company

--delete-target-dir

--num-mappers 1

--fields-terminated-by "\t"

--table staff

--where "id=3"                                    

2使用sqoop将:mysql中的数据导入到HIVE中****

实际上先导入到hdfs中,然后在hive中创建一个表,不需要提前创建表,然后把数据源Load进表中。也可以提前创建表,导入到指定的表中

bin/sqoop import\

--connect jdbc:mysql://hadoop102:3306/company \

--username root\

--password 123456\

--table staff\

--target-dir /user/company \

--hive-import\

--m 1\

--fields-terminated-by "\t"

--hive-table company.staff_hive(针对提前创建表,把数据导入的指定表staff_hive中的,staff_hive是否创建无所谓。)

--hive-overwrite

过程详解:

1.底层的mapreduce先将文件上传到hdfs对应的目录,/user/company/下(在执行期间可以在这个目录下看到上传的文件)

2.然后hive在根据数据源创建对应的表

3.将hdfs的数据源导入load进hive的表中。(这时hdfs上的文件因为导入到hive表中,而没有了。新的文件在hive/warehouse目录下)

4.用bin/hive  select * from company.staff可以查看数据,或者在user/hive/warehouse目录下查看。

二: Sqoop的数据导出

1. 将数据从HDFS导出到RDBMS数据库

     - 导出前,目标表必须存在于目标数据库中。

     - 默认操作是从将文件中的数据使用INSERT语句插入到表中

     - 更新模式下,是生成UPDATE语句更新表数据

           1.首先数据库中根据hdfs表中的属性建立空表

           2.然后执行导出命令

           3.验证表mysql命令行。

      举例:

            0.数据是在HDFS 中“EMP/”目录的emp_data文件中。

            1.根据hdfs中属性建表

            mysql> USE test;

            mysql> CREATE TABLE employee (

                               id INT NOT NULL PRIMARY KEY,

                              name VARCHAR(20),

                              deg VARCHAR(20),

                              salary INT,

                             dept VARCHAR(10));

2.执行导出命令

bin/sqoop export \

--connect jdbc:mysql://hadoop102/test\

--username root \

--password root \

--table employee \

--export-dir /user/hadoop/emp/

3.在mysql里检查

mysql>select \* from employee;

                   

三:sqoop对应的脚本的文件是***.opt文件

使用opt文件打包sqoop命令,然后执行 ( sqoop脚本命令参数必须分行

Step1 创建一个.opt文件

Step2 编写sqoop脚本

export

--connect

jdbc:mysql://hadoop-senior01.robot.com:3306/company

--username

root

--password

123456

--table

staff_mysql

--num-mappers

1

--export-dir

/user/hive/warehouse/company.db/staff_hive

--input-fields-terminated-by

"\t"

Step3 执行该脚本

\$ bin/sqoop --options-file opt/job_hffs2rdbms.opt