0 参考链接:
http://www.cnblogs.com/cenyuhai/p/3306037.html sqoop 常用命令整理(一)
http://www.cnblogs.com/cenyuhai/p/3306056.html sqoop 常用命令整理(二)
如下是 我工作中遇到的东西,每条语句都本机测试通过:
1 查看所有数据库:
sqoop list-databases --connect jdbc:mysql://192.168.1.1:3306/ --username root --password 123456
2 查看具体数据库内的表
sqoop list-tables --connect jdbc:mysql://localhost:3306/kellte --username root --password 123456
3 将关系型数据表结构users复制到Hive默认库的表users(此时如果不创建users表的话,那么表是内部表)中:
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table users
--username root --password 123456 --hive-table users
--fields-terminated-by "\0001" --lines-terminated-by "\n";
参数说明: 这两个参数可以不加
--fields-terminated-by "\0001" 是设置每列之间的分隔符,"\0001"是ASCII码中的1,
它也是hive的默认行内分隔符, 而sqoop的默认行内分隔符为","
--lines-terminated-by "\n" 设置的是每行之间的分隔符,此处为换行符,也是默认的分隔符;
4 将mysql表student数据拷贝到hive默认库的student表中: 这里使用一个mapreduce来执行
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --passwd 123456
--table student --hive-import --hive-table student -m 1;
5 根据列导入数据: 将kettle库下student表的name属性 写入到 hive表的student1中
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --password 123456
--table student --column 'name' --hive-import --hive-table student1 -m1;
5.1 column 和 where合用在 mysql导出到hive中:
这是写到hive中的
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --password 123456
--table student --columns "id,name" --where "id > 3 and (age = 88 or age = 80)" -m 1
--target-dir /user/hive/warehouse/userinfos2 --fields-terminated-by ",";
这是写到hdfs中的
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --password 123456
--table student --columns "id,name" --where "id > 3 and (age = 88 or age = 80)" -m 1
--hive-import --hive-table student5;
注意:--target-dir /user/hive/warehouse/userinfos2 可以用 --hive-import --hive-table userinfos2 进行替换
6 增量添加数据: 将Mysql表student5从在主键大于2的基础上导出数据到hive表student5中,其中
mysql表student5的id必须是自增,否则无法执行
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --password 123456
--table student5 --hive-import --hive-table student5 -m 1 --incremental append --check-column 'id'
--last-value 2;
7 query过滤条件使用: 将mysql表3个字段写到hdfs中,写入到hdfs后,字段以:间隔,各行之间以id间隔
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --password 123456
--query "select id,name,kc_name from student5 where \$CONDITIONS"
--target-dir /opt/hadoop/hive/warehouse/student5
--fields-terminated-by “:” --split-by student5.id;
注意: 上述代码在命令行中需要写在一行, 并且 $CONDITIONS 在 ""内的时候,需要\来转义
使用' 则不需要\转义, $CONDITIONS和 query必须同时出现。
在oozie 拼接的 sqoop workflow.xml中 拼接的 sqoop query 时, $CONDITIONS 不需要转义
8 query 将数据写到Hive中 :
sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --password 123456
--query "select id,name,kc_name from student5 where \$CONDITIONS and id>3"
--target-dir /opt/hadoop/hive/warehouse/student5
--fields-terminated-by “,” --split-by student5.id --hive-import --hive-table student5 -m 1; 需要注意的: --query 必须和 --target-dir 一起使用, 在写出到hive表时, --target-dir即使不指定hive表student5所在的HDFS路径, hive表数据也会写进来,不过不建议这样吧,至少我试验时会出现这种现象 hive 表创建时用什么分隔符分割字段,那么--target-dir 也需要指定同样的分隔符。 query方式导入(hdfs/hive)数据要比 import+column方式复杂,但是query方式提供了在其内写复杂sql的能 9 没有主键表插入: 其中hive标student创建为: create table student(address string,name string,s_id string) row format delimited fields terminated by '\t'; 这里以 s_id作为行间隔 sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --passwd 123456 --table student --split-by s_id --hive-import --hive-table student -m 1 --fields-terminated-by "\t" --null-string "**" --null-non-string "##"; 10 分区导入: 14 关联多表无关系全量进行查询: sqoop import --connect jdbc:mysql://192.168.1.1:3306/kettle --username root --passwd 123456 --query 'select name,age from student1 union all select name,age from student2 where $CONDITIONS' --target-dir /user/hdfs/test1 --split-by name --fields-terminated-by "\t" --null-string "**" --null-non-string "##" -m 1; 15 关联多张表关系查询: