Sqoop简介
1.概念:Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具
(1)导入:从关系型数据库到Hadoop平台
(2)导出:从Hadoop平台到关系型数据库
(3)本质:将导入导出命令翻译成MapReduce程序并行执行
(4)场景:常用于数仓中业务数据导入
2.目标用户
(1)系统管理员、数据库管理员
(2)大数据分析师、大数据开发工程师等
Sqoop命令
1.导入(sqoop import)
(1)从RDB导入表到HDFS
①常规导入
sqoop import
--connect jdbc:mysql://192.168.228.152:3306/retail_db //配置数据库连接为MySQL中数据库
--driver com.mysql.jdbc.Driver--table customers
--username root
--password 12345
--target-dir /data/retail_db/customers //导入指定目录
-m 3 //表示Mapper数量
②通过where语句过滤导入表中
sqoop import
--connect jdbc:mysql://192.168.228.152:3306/retail_db
--table orders
--where "order_id < 500" //指定where条件
--username root
--password 12345
--delete-target-dir //如果目标文件存在,则删除
--target-dir /data/orders
-m 3
③通过COLUMNS过滤导入表
sqoop import
--connect jdbc:mysql://192.168.228.152:3306/retail_db
--table user
--columns "order_id,order_date,order_customer_id" //导入指定列
--username root
--password 12345
--delete-target-dir
--target-dir /data/user
-m 3
④使用query方式导入数据
注:
C
O
N
D
I
T
I
O
N
S
:
使
用
w
h
e
r
e
子
句
必
须
添
加
,
如
果
q
u
e
r
y
后
面
使
用
的
是
双
引
号
,
则
CONDITIONS:使用where子句必须添加,如果query后面使用的是双引号,则
CONDITIONS:使用where子句必须添加,如果query后面使用的是双引号,则CONDITIONS前面必须加转义符,防止Shell识别为自己的变量
split-by:用于指定分割的列
sqoop import
--connect jdbc:mysql://192.168.228.152:3306/retail_db
--query "select * from orders where order_status != 'CLOSED' and \$CONDITIONS"
--username root
--password 12345
--split-by order_status
--delete-target-dir
--target-dir /data/order_stauts
-m 3
⑤使用Sqoop增量导入数据
incremental指定增量导入的模式
append:追加数据记录
lastmodified:可追加更新的数据
sqoop import
--connect jdbc:mysql://192.168.228.152:3306/retail_db
--table orders
--username root
--password 12345
--incremental append //增量导入方式为append 追加数据至已经存在的HDFS数据集
--check-column order_date //指定递增的列
--last-value '2014-04-15' //指定上一次导入的最大值
--target-dir /data/orders
-m 3
⑥导入文件格式
导入时指定文件格式参数
–as-textfile 导入数据为text文件(默认)
–as-avrodatafile 导入数据为avro文件
–as-sequencefile 导入数据为sequence文件
–as-parquetfile 导入数据为parquet文件
sqoop import
--connect jdbc:mysql://192.168.228.152:3306/hr
--table orders
--username root
--password 12345
--delete-target-dir
--target-dir /data/orders
-m 3
--as-sequencefile
(2)从RDB导入数据到Hive
①直接导入数据到Hive
–create-hive-table:自动创建表,生产中一般不使用
–hive-overwrite:覆盖原有表数据
sqoop import
--connect jdbc:mysql://192.168.228.152:3306/retail_db
--table orders
--username root
--password 12345
--hive-import //通过hive-import指定导入到Hive
--create-hive-table //指定创建一个新的hive表,如果表已经存在则报错
--hive-database retail_db
--hive-table orders
-m 3
②导入数据到Hive分区
sqoop import
--connect jdbc:mysql://hadoop102:3306/retail_db
--query "select order_id, order_status from orders where order_date >= '2014-07-24' and order_date < '2014-07-26' and \$CONDITIONS"
--username root
--password 12345
--target-dir /user/data/orders
--split-by order_status
--hive-import
--hive-table eShop.orders
--hive-partition-key "order_date" //指定分区字段
--hive-partition-value "20140724" //指定分区值
-m 3
(3)从RDB导入数据到HBase
导入MySQL数据到HBase
sqoop import
--connect jdbc:mysql://192.168.228.152:3306/retail_db
--username root
--password 12345
--driver com.mysql.jdbc.Driver
--table products //指定导入HBase的表
--columns "product_id, product_name, product_description, product_price, product_image"
--hbase-table products
--column-family data
--hbase-row-key product_id
-m 3
2.导出(sqoop export)
(1)导出HDFS数据到MySQL
①在MySQL中创建表
②导出数据到MySQL
sqoop export
--connect jdbc:mysql://192.168.228.152:3306/retail_db
--username root
--password 12345
--table customers_demo
--export-dir /customerinput
-m 1
3.sqoop job使用
(1)创建job进行增量导入
sqoop job \
--create sqoop_time \
-- import \
--connect jdbc:mysql://192.168.228.152:3306/retail_db \
--username root \
--password 12345 \
--table orders \
--hive-import \
--hive-table retail_db.orders \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--incremental append \
--check-column order_date \
--last-value '2014-07-26 00:00:00'
(2)查看job
sqoop job --list
(3)执行job
sqoop job --exec sqoop_time
(4)删除job
sqoop job --delete sqoop_name