sqoop常用案例都在这

一、sqoop案例

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 其它属性

1.1列出数据库

sqoop list-databases \
--connect jdbc:mysql://master:3306 \
--username root --password root;

1.2列出表:

列出表:
sqoop list-tables \
--connect jdbc:mysql://master:3306/test \
--username root --password root;

1.3:mysql导入到hdfs

导入数据到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

1.4:mysql导入到hive表中

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 

1.5:使用query导入hdfs中

--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

 

1.6:增量导入 mysql导入到hdfs

关键字段
​
    –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

1.7:sqoop的job

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

1.8:sqoop的导出 从hdfs导出到mysql

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;

1.9:sqoop的job的增量导入

1.9.1:基于列的增量数据(append方式)从MySQL导入到hive中

增量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

1.9.2:基于时间的增量数据(LastModified方式)从MySQL导入到hive中

方式一:

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,他就会追加进来

1.10:补充:

如下两个使用于有主键的表的数据更新:
--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"
}

 

你可能感兴趣的:(大数据相关)