Sqoop 导入&导出

Sqoop 作用:
数据从RDBMS和Hadoop之间进行导入导出操作
底层就是使用MapReduce来实现的
Map 只有Map
Reduce 没有Reduce

导入: import
RDBMS --> Hdfs
RDBMS–> Hive

导出: export
Hdfs–>RDBMS
Hive–>RDBMS*

参数帮助查看—》sqoop help
[wzj@hadoop001 conf]$ sqoop help
19/12/24 14:05:55 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.16.2
usage: sqoop COMMAND [ARGS]

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import           Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.

exoprt : 导出
import : 导入
job : 作业
list-databases : 数据库列表
list-tables : 表列表

[wzj@hadoop001 ~]$ sqoop list-databases \
> --connect jdbc:mysql://hadoop001:3306 \
> --password 123456 \
> --username root
19/12/24 12:56:36 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.16.2
19/12/24 12:56:36 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
19/12/24 12:56:36 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
data_hive
mysql
performance_schema
test
[wzj@hadoop001 ~]$ sqoop list-tables \
> --connect jdbc:mysql://hadoop001:3306/test \
> --password 123456 \
> --username root
19/12/24 12:59:28 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.16.2
19/12/24 12:59:28 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
19/12/24 12:59:28 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
tset1

以上就是简单的查看命令帮助,并输出数据库和数据库表相关信息

数据导入HDFS

HDBMS—>HDFS

[wzj@hadoop001 bin]$ sqoop help import查看命令帮助

  • 全表导入
sqoop import \
--connect jdbc:mysql://hadoop001:3306/test \
--username root  \
--password 123456 \
--table tset1 \
--target-dir /user/wzj/ \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--mapreduce-job-name frommysql2hdfs


table:指定被导入的表名
target-dir:指定导入路径
delete-target-dir:如果目标目录存在就删除它
num-mappers:mapper的个数(map不指定会默认是4,则产生4个数据块)
fields-terminated-by:指定字段分隔符
--mapreduce-job-name:指定xxx.java名称

当执行关系型数据库导入hdfs的时候,默认会在执行目录下产生一个xxx.java的文件

[wzj@hadoop001 ~]$ ll
-rw-rw-r--. 1 wzj wzj 10543 Dec 24 13:04 tset1.java
[wzj@hadoop001 ~]$ hadoop fs -ls
19/12/25 17:00:25 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxr-xr-x   - wzj supergroup          0 2019-12-24 13:05 tset1

在这里插入图片描述

  • 导入指定列
sqoop import \
--connect jdbc:mysql://hadoop001:3306/test \
--username root  \
--password 123456 \
--table tset1 \
--target-dir /user/wzj/ \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--mapreduce-job-name frommysql2hdfs \
--columns "name"


table:指定被导入的表名
target-dir:指定导入路径
delete-target-dir:如果目标目录存在就删除它
num-mappers:mapper的个数(map不指定会默认是4,则产生4个数据块)
fields-terminated-by:指定字段分隔符
--mapreduce-job-name:指定xxx.java名称
--null-string '' :如果是字符串类型的空显示为
--null-non-string '0' :如果是非字符串类型的空显示为0
--columns ",,,"
  • 查询限制导入
[wzj@hadoop001 ~]$ sqoop import \
--connect jdbc:mysql://hadoop001:3306/test \
--username root  \
--password 123456 \
--table tset1 \
--target-dir /user/wzj/ \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--mapreduce-job-name frommysql2hdfs \
--columns "id,name" \
--where 'id<2'


table:指定被导入的表名
target-dir:指定导入路径
delete-target-dir:如果目标目录存在就删除它
num-mappers:mapper的个数(map不指定会默认是4,则产生4个数据块)
fields-terminated-by:指定字段分隔符
--mapreduce-job-name:指定xxx.java名称
--null-string '' :如果是字符串类型的空显示为
--null-non-string '0' :如果是非字符串类型的空显示为0
--columns ",,,":指定列
--where:条件限制

[wzj@hadoop001 ~]$ sqoop import \
--connect jdbc:mysql://hadoop001:3306/test \
--username root  \
--password 123456 \
--target-dir /user/wzj/ \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--mapreduce-job-name frommysql2hdfs \
--columns "id,name" \
--query 'select * from tset1 where id=2 and  $CONDITIONS'

table:指定被导入的表名
target-dir:指定导入路径
delete-target-dir:如果目标目录存在就删除它
num-mappers:mapper的个数(map不指定会默认是4,则产生4个数据块)
fields-terminated-by:指定字段分隔符
--mapreduce-job-name:指定xxx.java名称
--null-string '' :如果是字符串类型的空显示为
--null-non-string '0' :如果是非字符串类型的空显示为0
--columns ",,,":指定列
--query:sql语句
  • 增量导入
sqoop import \
--connect jdbc:mysql://hadoop001:3306/test\
--username root \
--password 123456\
--target-dir /user/wzj/ \
--num-mappers 1 \
--table tset1\
--null-string "" \
--null-non-string "0" \
--check-column "id" \
--incremental append \
--fields-terminated-by '\t' \
--last-value 1

--incremental append:增量
check-column:根据哪一行做增量导入
last-value:开始增量导入的上个位置
  • options-file
    sqoop --options-file xxx.opt
[wzj@hadoop001 ~]$ vi emp.opt
[wzj@hadoop001 ~]$ cat emp.opt 
import
--connect
jdbc:mysql://hadoop001:3306/test
--password
123456
--username
root
--target-dir
/user/wzj/
--delete-target-dir
--table
tset1
-m
1
[wzj@hadoop001 ~]$ sqoop --options-file emp.opt 
INFO mapreduce.Job: Running job: job_1577150260007_0019

往hdfs中传输数据的时候,因为map默认是4并且按照主键去拆分,当表没有主键的时候:
需要指定–num-mappers 1
或者需要用–split-by ‘column-name’

数据导入HIVE

RDBMS—>Hive

实际上数据也是先加载到hdfs再load进hive表中

sqoop import \
--connect jdbc:mysql://hadoop001:3306/test \
--password 123456 \
--username root \
--table emp \
--hive-overwrite \
--delete-target-dir \
--create-hive-table \
--hive-import \
--hive-database wzj \
--hive-table emp_mysql \
--num-mappers 1
#
--hive-import:加载数据到hive的标识
--create-hive-table:在hive中自动建表(不建议用此参数,因为数据类型有时候会发生变动,建议手动创建好表,再进行数据传输)
如果导入的是分区表,则需要指定分区的key和value:
--hive-partition-key 'key' \
--hive-partition-value 'value' \
如果hive中创建的表有指定分隔符,则需要加上:
--fields-terminated-by '\t' \


[wzj@hadoop001 ~]$ sqoop import \
> --connect jdbc:mysql://hadoop001:3306/test \
> --password 123456 \
> --username root \
> --table emp \
> --hive-overwrite \
> --delete-target-dir \
> --create-hive-table \
> --hive-import \
> --hive-database wzj \
> --hive-table emp_mysql \
> --num-mappers 1

数据导出

HDFS—>RDBMS

mysql中必须存在表
导入文件的分隔符要注意是否需要指定,默认的是“,”

  • 全部导入
sqoop export \
--connect jdbc:mysql://hadoop001:3306/test \
--password 123456 --username root \
--table test  \
--export-dir /user/wzj/partitiontest.txt \
--fields-terminated-by ',' \
-m 1

--table:要传入的表
--export-dir:HDFS文件地址
[wzj@hadoop001 ~]$ sqoop export --connect jdbc:mysql://hadoop001:3306/test --password 123456 --username root --table test  --export-dir /user/wzj/partitiontest.txt --fields-terminated-by ',' -m 1

  • 选定列导入
sqoop export \
--connect jdbc:mysql://hadoop001:3306/test \
--password 123456 --username root \
--table emp \
--columns "empno,ename,job,mgr,hiredate,sal" \
--export-dir /user/wzj/emp.txt \
--fields-terminated-by '\t' \
-m 1

--columns:指定列

[wzj@hadoop001 ~]$ sqoop export --connect jdbc:mysql://hadoop001:3306/test --password 123456 --username root --table emp --columns "empno,ename,job,mgr,hiredate,sal" --export-dir /user/wzj/emp.txt --fields-terminated-by '\t' -m 1
  • 批量导入
sqoop export \
-Dsqoop.export.records.per.statement=5 \
--connect jdbc:mysql://hadoop001:3306/test \
--password 123456 --username root \
--table emp \
--columns "empno,ename,job,mgr,hiredate,sal" \
--export-dir /user/wzj/emp.txt \
--fields-terminated-by '\t' \
-m 1

-Dsqoop.export.records.per.statement=5 :一个事务一次提交几条可以指定,而不是每一条都insert

[wzj@hadoop001 ~]$ sqoop export \
> -Dsqoop.export.records.per.statement=5 \
> --connect jdbc:mysql://hadoop001:3306/test \
> --password 123456 --username root \
> --table emp \
> --columns "empno,ename,job,mgr,hiredate,sal" \
> --export-dir /user/wzj/emp.txt \
> --fields-terminated-by '\t' \
> -m 1

数据导出

Hive—>RDBMS

sqoop export \
--connect jdbc:mysql://hadoop001:3306/test \
--password 123456 \
--username root \
--table test_hive \
--export-dir /user/hive/warehouse/wzj.db/test \
--fields-terminated-by ',' \
-m 1
发布了45 篇原创文章 · 获赞 1 · 访问量 1764

猜你喜欢

转载自blog.csdn.net/wzj_wp/article/details/103682179
今日推荐