Sqoop数据迁移

Sqoop简介

Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具,数据导入是指从关系型数据库到Hadoop平台,导出是指从Hadoop 平台到关系型数据库,其本质是将导入、导出命令翻译成MapReduce程序并行执行,最常见的业务场景是数据仓库中数据导入。

从RDB导入数据到HDFS
  • 导入表到HDFS
    sqoop import
    --connect jdbc:mysql://localhost:3306/database
    --driver com.mysql.jdbc.Driver
    --table table_name
    --columns "col1,...,coln"
    --where "condition"
    --username root
    --password root
    --delete-target-dir
    --target-dir /hdfs_path
    --m 3
    sqoop import也可写成sqoop-import,sqoop命令位于sqoop/bin目录下
    connect配置数据库的url
    driver配置数据库驱动
    table配置要导入的表名
    column用于指定要导入的列名
    where用于条件过滤
    username代数据库用户名
    password配置数据库连接密码
    delete-target-dir目标目录存在,则删除
    target-dir配置要导入到的hdfs地址,该地址不能存在,否则报错
# 建表语句
CREATE TABLE student(
sid INT AUTO_INCREMENT PRIMARY KEY,
sname VARCHAR(10),
age INT DEFAULT 20,
gender VARCHAR(10) DEFAULT 'male'
);
INSERT INTO student(sname) VALUES('n1'),('n2'),('n3'),('n4'),('n5'),('n6'),('n7'),('n8'),('n9'),('n10'),('n11'),('n12'),('n13'),('n14'),('n15'),('n16'),('n17'),('n18'),('n19');
# 示例:将student表导入到hdfs的/data/stu3
# 以下代码在linux命令行中,\为换行符,每个\前有个空格
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--driver com.mysql.jdbc.Driver \
--table student \
--column "sname"
--where "sid between 1 and 10" \
--username root \
--password root \
--delete-target-dir \
--target-dir /data/stu3 \
--m 3

在这里插入图片描述

hdfs查看
在这里插入图片描述

  • 使用query的方式导入数据
    sqoop import
    --connect jdbc:mysql://localhost:3306/student
    --query "select * from student where sid between 1 and 10 and \$CONDITIONS "
    --username root
    --password root
    split-by sid
    --delete-target-dir
    --target-dir /hdfs_path
    --m 3
    query代表查询的语句,其中所有查询都应该以$CONDITIONS结束;sqoop内部使用该条件将记录范围分发给所有Mapper
    split-by sid:用于指定分割数据的列,split会通过select max(id),min(id) from test查询出最大id和最小id,根据–m 的分区数,比如m为4,有100条数据,就把max、min之间的区间平均分为4份,0~ 25,26~50,51 ~75,76 ~100。没有指定–split-by时,会根据主键划分;没有主键又没有–split-by时,任务就不能并行的运行,此时必须指定-m 1或者–autoreset-to-one-mapper只运行一个map任务
# 示例:将student表的sid在11~20之间的sid,sname,age导入到hdfs的/data/stu4
# split-by对非数字类型的字段支持不好,一般用于主键及数字类型的字段
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--query "select sid,sname,age from student where sid between 11 and 20 and \$CONDITIONS" \
--username root \
--password root \
-- split-by sid \
--delete-target-dir \
--target-dir /data/stu \
--m 3
  • 增量导入
    sqoop import
    --connect jdbc:mysql://localhost:3306/database
    --driver com.mysql.jdbc.Driver
    --table table_name
    --username root
    --password root
    --delete-target-dir
    --incremental append
    --check-column column_name
    --last-value 'value'
    --target-dir /hdfs_path
    --m 3
    incremental append:增量导入方式为append,追加数据至已经存在的HDFS数据集
    check-column:指定递增的列,一般为主键
    last-value:指定上次导入的最大值,本次导入会从上次最大值+1的位置开始
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--table student \
--where "sid>10" \
--username root \
--password root \
--incremental append \
--check-column sid \
--last-value 10 \
--target-dir "/data/stu" \
--m 2
从RDB导入数据到Hive
  • 直接导入数据到Hive
    sqoop import
    --connect jdbc:mysql://localhost:3306/database
    --driver com.mysql.jdbc.Driver
    --table table_name
    --username root
    --password root
    hive-import
    create-hive-table
    hive-database database_name
    --hive-table table_name
    --m 3
    hive-import:通过hive-import指定导入到Hive
    create-hive-table:指定创建一个新的hive表,如果表已经存在则报错
    hive-database :指定数据库名称,需要存在,否则报错
    hive-table:指定表名,需要不存在,否则报错
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--table student \
--username root \
--password root \
--hive-import \
--create-hive-table \
--hive-database sqooptest \
--hive-table stu2 \
--m 1
  • 导入数据到Hive分区
    需要导入jar包,将hive-common、hive-exec两个jar包,从hive的lib目录中复制到sqoop的lib目录:
    示例1:
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--username root \
--password root \
--table orders  \
--where "order_date between '2013-07-24' and '2013-07-25'" \
--hive-import \
--hive-table sqooptest.order_p \
--split-by order_status \
--hive-partition-key "date" \
--hive-partition-value "20200724" \
--hive-overwrite \
--m 1

示例2:

#建表
create table products(
product_id int,
product_category_id int,
product_name string,
product_description string,
product_price double,
product_image string)
partitioned by(category int);
row format delimited
fields terminated by ',';
# 导入数据
/opt/sqoop/bin/sqoop-import  \
--connect jdbc:mysql://hadoop4:3306/student \
--username root \
--password root \
--query "select * from products where product_id between 1 and 200 and \$CONDITIONS" \
--hive-import \
--hive-table sqooptest.products \
--hive-partition-key "category" \
--hive-partition-value 2 \
--hive-overwrite \
--target-dir /data/products \
--m 1
# 追加
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--username root 
--password root 
--query "select * from products where product_id between 201 and 400 and \$CONDITIONS" \
--incremental append 
--hive-import 
--hive-table sqooptest.products 
--hive-partition-key "category" 
--hive-partition-value 3 
--check-column product_id 
--target-dir /data/products 
--m 1
从RDB导入到Hbase

sqoop import
--connect jdbc:mysql://localhost:3306/database
--driver com.mysql.jdbc.Driver
--username root
--password root
--table table_name
--column "colu1,...,colun"
--hbase-create-table
--hbase-table table_name
--column-family
--hbase-row-key
--m 1
hbase-create-table:指定新建表
hbase-table:指定表名,不能存在
column-family:指定列簇名
hbase-row-key:指定行键名

/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--username root \
--password root \
--table products \
--columns "product_id,product_name,product_price" \
--hbase-create-table \
--hbase-table product \
--column-family prod \
--hbase-row-key product_id \
--m 1
HDFS数据导出到MySQL
  • 使用sqoop export导出数据到MySQL
    sqoop export
    --connect jdbc:mysql://hadoop4:3306/database_name
    --username root
    --password root
    --table table_name
    --export-dir hdfs_path
    --m 1
/opt/sqoop/bin/sqoop export  \
--connect jdbc:mysql://hadoop4:3306/sqoop \
--username root \
--password root \
--table orders \
--export-dir /data/stu2/  \
--input-fields-terminated-by ',' \
--m 1

input-fields-terminated-by用于指定字段分割符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值