Sqoop——数据导入
Sqoop,一个用于Hadoop和结构化数据存储之间进行高效传输大批量数据的工具:
将数据从关系型数据库管理系统导入到Hadoop系统中
将数据从Hadoop系统中抽取并导出到关系型数据库。
Sqoop简介以及使用
Sqoop底层实现原理
Sqoop的核心设计思想是利用Map Reduce加快数据传输速度。
特点
Sqoop的重要关键词
- import:从关系型数据库到Hadoop;
- export:从Hadoop到关系型数据库。
Sqoop命令执行
常见命令执行参数
通过Sqoop加不同参数可以执行导入导出,通过sqoop help 可以产看常见的命令行
Sqoop运行的时候不需要启动后台进程,直接执行Sqoop 命令加参数即可。
查看数据库
sqoop list-databases \
--connect jdbc:mysql://localhost:3306 \
--username root \
--password 123456;
通过文件传递参数
文件 config.conf
list-databases
--connect
jdbc:mysql://localhost:3306
--username
root
--password
123456
命令:
sqoop --options-file config.conf
Import
连接数据库
sqoop import \
--connect jdbc:mysql://database.example.com/databaseName \
--username xxxx \
--password xxxxxx;
sqoop import \
--connect jdbc:mysql://localhost:3306/mysql \
--username root \
--password 123456;
查看所有表
sqoop list-tables \
--connect jdbc:mysql://localhost:3306/mysql \
--username root \
--password 123456;
将数据导入HDFS
指定表导入
数据在Linux下的Mysql数据
在本地MySql数据库中新建一个testdb 数据库,建表test 表并写入数据
使用--table 参数可以指定具体的表导入到HDFS,譬如用 --table test ,默认情况下是全部字段导入,如下:
sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
--password 123456 \
--table test \
--target-dir hdfs://localhost:9820/sqoopdata/test1 \
--delete-target-dir
#将localhost改为IP地址
使用hdfs的命令查询结构
hdfs dfs -cat /sqoopdata/test1/par*
指定列导入
想要导入某几列,可以使用--columns ,如下:
sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
--password 123456 \
--table test \
--columns 'id,name' \
--target-dir hdfs://localhost:9820/sqoopdata/test2 \
--delete-target-dir
指定条件导入
在导入表的时候,也可以通过指定where条件来导入,具体参数使用 --where ,譬如要导入的记录,可以用下面参数:
sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \
--username root \
--password 123456 \
--table test \
--columns 'id,name' \
--where 'id=01' \
--target-dir hdfs://localhost:9820/sqoopdata/test2 \
--delete-target-dir
指定sql导入
Sqoop可以通过自定义的sql来进行导入,通过--query 参数来进行导入,这样就最大化的用到了Sql的灵活性.如下:
sqoop import --connect jdbc:mysql://localhost:3306/testdb \
--username root --password 123456 \
--query 'select id,name,age from test WHERE id=01 and $CONDITIONS' \
--target-dir hdfs://localhost:9820/sqoopdata/test2 \
--delete-target-dir \
--split-by id \
-m 1
#表没有主键,使用--split-by指定执行split的字段
#表没有主键,需要指定map task的个数为1才能执行
在通过--query 来导入数据时,必须要指定--target-dir
将数据导入到Hive
示例代码:
sqoop import --connect jdbc:mysql://localhost:3306/testdb \
--username root \
--password 123456 \
--table test \
--hive-import \
--hive-overwrite \
--hive-table "test3" \
--hive-database Testdb \
-m 1
导入填充空值数据
sqoop import --connect jdbc:mysql://localhost:3306/testdb \
--username root --password 123456 \
--table test \
--delete-target-dir \
--target-dir hdfs://localhost:9820/sqoopdata/test \
--null-string '\\N' \
--null-non-string '0'
关键参数
-null-string '\\N' ## 遇到空字符串会填充\N字符
--null-non-string '0' # 遇到空数字会填充0
|