(二)Sqoop使用教程

一.Sqoop简介

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

二.Sqoop原理

将导入或导出命令翻译成mapduce程序来实现。在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。

三.下载安装

参照此https://www.cnblogs.com/Agent9527/p/13195068.html进行安装。

四.Sqoop简单使用案例

4.1导入数据

在Sqoop中“导入”是指从非大数据集群(RDBMS)向大数据集群(HDFS\Hive\HBase)中传输数据,叫做:导入,即使用import关键字。与其相反称之为导出,即使用关键字“export”。

4.2从RDBMS到HDFS

确定Mysql服务开启正常;在Mysql数据库中新建一张表并插入数据。

Mysql建库建create database company;
create table company.staff(
id int(4) primary key not null auto_increment,
name varchar(255),
sex varchar(255));
插入测试数据
insert into company.staff(name,sex) values("Thcmas","Male");
insert into company.staff(name,sex) values(‘Catalina’,’ReMale’);

Mysql --> HDFS  注意:粘贴以下时把“#号”前面的空格以及“#号”后面的内容删掉。

1.全部导入
sqoop import \  # 启动sqoop命令 导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入的表名
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建)
--delete-target-dir \ # 删除原先已有的表
--num-mappers 1 \ # map工作数(自己确定就行了)
--fields-terminated-by "\t" # 指定分隔符不指定会粘到一块

2.查询select导入
sqoop import \  # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?)
--delete-target-dir \ # 删除原先已有的表
--num-mappers 1 \ # map工作数(自己确定就行了)
--fields-terminated-by "\t" # 指定分隔符
--query " 列1,列2,列3 from 表 where 列1 <=1 and \$CONDITIONS;" # 保证在多个map任务时保证数据顺序前后一致

3.指定columns导入
sqoop import \  # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入HDFS的表名
--columns 列1,列2 \ # 指定列名导出
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?)
--delete-target-dir \ # 删除原先已有的表
--num-mappers 1 \ # map工作数(自己确定就行了)
--fields-terminated-by "\t" # 指定分隔符

4.关键字where+columns筛选导入
sqoop import \  # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入HDFS的表名
--columns 列1,列2 \ # 指定列名导入
--where 列1条件 \ # 指定列条件进行导入
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建?)
--delete-target-dir \ # 删除原先HDFS已有的表
--fields-terminated-by "\t" # 指定分隔符
--num-mappers 1 \ # map工作数(自己确定就行了)

Mysql --> HDFS --> Hive

sqoop import \  # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入HDFS的表名
--columns 列1,列2 \ # 指定列名导入
--where 列1条件 \ # 指定列条件进行导入
--hive-import \ # 又从HDFS导入hive
--hive-database 库\ # 导入的指定库名 
--hive-table 表 \ # 将要导入的hive表
--hive-overwrite \ # 覆盖原先hive已有的表
--fields-terminated-by "\t" # 指定分隔
--num-mappers 1 \ # map工作数(自己确定就行了)这放后面好看点 

RDBMS --> HDFS --> HBase

sqoop import \  # 启动sqoop导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入HDFS的表名
--columns 列1,列2 \ # 指定列名导入
--where 列1条件 \ # 指定列条件进行导入
--hbase-create-table \ # 是否创建表?
--hbase-table "表名" \ # 指定要导入的HBase中的表名
--column-family "hbase列族" \ # 指定要导入的HBase表的列族
--hbase-row-key "mysql列" \ # 指定mysql中的某一列作为HBase表中的rowkey
--split-by id \ # 指定mysql中的某一列作为分区导入。默认是主键
--num-mappers 1 \ # map工作数(自己确定就行了) 

4.3(从HDFS/Hive导出到RDBMS) HDFS与Hive语法一样

sqoop export \  # 启动sqoop导出 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)导出到mysql的库名
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 导出到mysql的表名
--export-dir /路径名/路径名/路径名 \ # 从hdfs&hive导出的hive/hdfs文件路径
--input-fields-terminated-by "\t" \ # 从hdfs&hive导出的指定切割符
--num-mappers 1 \ # map工作数

五. Shell拓展

可利用shell编写脚本实现;减少麻烦

# vim test.sh  Linux下编译名为test.sh的shell脚本。扩展名并不影响脚本执行,见名知意就好。添加以下内如。
#!/bin/bash  #告诉系统这个脚本需要什么解释器来执行
sqoop import \  # 启动sqoop命令 导入 \换行符
--connect jdbc:mysql://主机名:3306/库 \ # 连接(固定)
--username root \ # 连接mysql的账号名
--password 密码 \ # 连接mysql的账号密码
--table 表 \ # 即将导入的表名
--target-dir /路径名/路径名 \ # 导入的路径(没有HFDS会创建)
--delete-target-dir \ # 删除原先已有的表
--num-mappers 1 \ # map工作数(自己确定就行了)
--fields-terminated-by "\t" # 指定分隔符不指定会粘到一块
:wq  保存退出
chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

 

posted @ 2020-12-13 14:09  九五二七_唐伯虎  阅读(794)  评论(0编辑  收藏  举报