sqoop语句要求写成1行,多行时用\连接。
sqoop的相关属性有先后顺序、有搭配要求。
sqoop help
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
sqoop import/export/job/merge/list-databases/list-tables --connect 其它属性
sqoop list-databases \
--connect jdbc:mysql://master:3306 \
--username root --password root;
列出表:
sqoop list-tables \
--connect jdbc:mysql://master:3306/test \
--username root --password root;
导入数据到hdfs:
sqoop import --connect jdbc:mysql://master:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table stu \
-m 1 \
--fields-terminated-by '\t' \
--compress \
--columns 'id,name,age' \
--target-dir hdfs://master:9000/sqoop/02
CREATE TABLE sq1(
id bigint,
firstname string,
age string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
;
sqoop import --connect jdbc:mysql://master:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table stu \
--columns 'id,name,age' \
--null-string '\\N' \
--null-non-string 0 \
--delete-target-dir \
--fields-terminated-by '\t' \
--hive-import \
--hive-overwrite \
--hive-table mytest.sq1
--query 和 --table 不能同时存在
sql写成1行
query后使用'' 和 "" 的区别 注意:\$CONDITIONS
sqoop import --connect jdbc:mysql://master:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
-m 1 \
--split-by id \
--fields-terminated-by '\t' \
--query 'SELECT s1.id, s1.`name`, s1.age FROM stu s1 LEFT JOIN stu1 s2 ON s1.id = s2.id WHERE s2.`name` is NULL AND s1.id > 3 and $CONDITIONS' \
--as-parquetfile \
--target-dir hdfs://master:9000/sq/06
sqoop import --connect jdbc:mysql://master:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
-m 1 \
--split-by id \
--fields-terminated-by '\t' \
--query 'SELECT s1.id, s1.`name`, s1.age FROM stu s1 LEFT JOIN stu1 s2 ON s1.id = s2.id WHERE s2.`name` is NULL AND s1.id > 3 and $CONDITIONS' \
--as-parquetfile \
--delete-target-dir \
--target-dir hdfs://master:9000/sq/08
关键字段
–incremental append \
–check-column id \
–last-value 0 \
全量导入:(整张表全部导出)
增量分为两种:append 和 lastmodified(使用时间戳)
sqoop import --connect jdbc:mysql://master:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table stu \
--incremental append \
--check-column id \
--last-value 0 \
--target-dir hdfs://master:9000/sqoop/05
sqoop import --connect jdbc:mysql://master:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table stu \
-m 1 \
--incremental append \
--check-column id \
--last-value 4 \
--target-dir hdfs://master:9000/sqoop/06
--使用时间戳
sqoop import --connect jdbc:mysql://master:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table stu \
--incremental lastmodified \
--check-column uptime \
--last-value 0 \
--target-dir hdfs://hd:9000/sqoop/08
sqoop job --list 列出所有的job
sqoop job --show jobname 显示jobname的信息 要输密码
sqoop job --delete jobname 删除jobname
sqoop job --exec jobname 执行jobname 要输密码
sqoop的job:
--create Create a new saved job
--delete Delete a saved job
--exec Run a saved job
--help Print usage instructions
--list List saved jobs
--meta-connect Specify JDBC connect string for the
metastore
--show Show the parameters for a saved job
--verbose Print more information while working
------------------------------------从mysql到hdfs中
sqoop job --create myjob1 -- import --connect jdbc:mysql://master:3306/test \
--driver com.mysql.jdbc.Driver \
--username root --password root \
--table stu \
-m 1 \
--incremental append \
--check-column id \
--last-value 0 \
--target-dir hdfs://master:9000/sqoop/06
sqoop job --exec myjob1 要输入密码root
sqoop export \
--connect jdbc:mysql://master:3306/test \
--username root \
--password root \
--table stu2 \
--input-null-string '' \
--input-null-non-string '' \
--export-dir hdfs://master:9000/sqoop/06/*
CREATE TABLE `stu2` (
`id` int(11) NOT NULL DEFAULT '0',
`student_id` int(11) DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
`age` int(1) DEFAULT NULL,
`sex` varchar(1) DEFAULT NULL,
`birthday` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
增量append方式导入数据:
sqoop job --create mysecondjobs -- import --connect jdbc:mysql://master:3306/test \
--username root --password root \
--driver com.mysql.jdbc.Driver \
--table u \
-m 1 \
--incremental append \
--check-column id \
--last-value 0 \
--target-dir hdfs://master:9000/user/hive/warehouse/mytest.db/userinfo
//创建hive表
create table userinfo(
id int,
name string
)
row format delimited fields terminated by ',';
sqoop job --exec mysecondjobs
第一次执行job,发现last-value=5;
在mysql的表里面再次插入数据(插入了一条数据)
再一次执行job,发现last-value=6;
sqoop job --show mysecondjobs
方式一:
sqoop job --create mythreejobs -- import --connect jdbc:mysql://master:3306/test \
--username root --password root \
--driver com.mysql.jdbc.Driver \
--table u1 \
-m 1 \
--append \
--incremental lastmodified \
--check-column lastmodify \
--last-value '2019-08-10 14:57:26' \
--target-dir /user/hive/warehouse/mytest.db/userinfo1
create table userinfo1(
id int,
name string,
lastmodify string
)
row format delimited fields terminated by ',';
sqoop job --exec mythreejobs
第一次执行job,发现last-value '2019-09-21 15:27:26;
在mysql的表里面再次插入数据(插入了一条数据)
再一次执行job,发现last-value='2019-09-21 15:42:26;
sqoop job --show mysecondjobs
解释一下:append和--hive import 不能同时使用
和id的增量数据一样,结果报了第一个错,,删掉target-dir那里的目录,然后报了第二个错,
提示当使用lastmodified增量导入的时候需要添加--append \ 或者-- merge-key 字段名称
到此问题解决
方式二:
sqoop job --create myfourthjobs -- import --connect jdbc:mysql://master:3306/test \
--username root --password root \
--driver com.mysql.jdbc.Driver \
--table u1 \
--hive-import \
--hive-database mytest \
--hive-table testlast \
--incremental lastmodified \
--check-column lastmodify \
--last-value '2019/09/10 14:39:00'
说明:
1)在上面的job当中,不能指定-m ,因为指定了-m的话,对应的导入会在hdfs上差生相应的中间结果,当你下一次再次执行job时,则会因为output directory is exist 报错。或者可以知道 -m 1 再加上 --delete-target-dir \ 删除存在的目标目录也行。
2)上面的hive的表testlast必须是已存在的。在第一次导入的时候,为了使得表存在,可以通过将mysql中的testlast的表结构导入到hive中,执行的命令如下:
sqoop create-hive-table \
--connect jdbc:mysql://NameNode:3306/test \
--username root --password root \
--table u1 \
--hive-database qf24 \
--hive-table testlast
执行完后,会在hive中创建一个具有相同名字和相同表结构的表。
完了测试即可
sqoop job --exec myfourthjobs
注意事项:修改信息之后,不会覆盖原有信息,他会追加进来,结果如下图所示,只要大于上次的last-value,他就会追加进来
如下两个使用于有主键的表的数据更新:
--update-key
--update-mode allowinsert
mysql表的编码格式做为utf8,hdfs文件中的列数和mysql表中的字段数一样
导出暂不能由hive表导出mysql关系型数据库中
从hdfs到mysql时注意数据类型
--export-dir是一个hdfs中的目录,它不识别_SUCCESS文件
678
789
890
导入成功 (目录下没有数据 /mytest/10/)
890
{
"index": 0,
"type": "int"
},
{
"index": 1,
"type": "string"
}