一、准备测试表和测试数据
create table sqoop_test(
id int primary key auto_increment comment '自增id',
name varchar(20) comment '姓名',
age int comment '年龄',
sex char(1) comment '性别'
)ENGINE=INNODB comment 'sqoop的测试表';
insert into sqoop_test(name,age,sex) values('zhangsan',18,'男'),('lisi',20,'女'),('jerry',20,'女'),('tom',20,'男'),('jinjin',20,'女');
-------------------------------
没有主键的表
create table sqoop_test_no_primary_key(
name varchar(20) comment '姓名',
age int comment '年龄',
sex char(1) comment '性别'
)ENGINE=INNODB comment 'sqoop的测试表不带主键';
insert into sqoop_test_no_primary_key(name,age,sex) values('zhangsan',18,'男'),('lisi',20,'女'),('jerry',20,'女'),('tom',20,'男'),('jinjin',20,'女');
二、常用组合
(1)带where条件导数据
sqoop import \
--connect jdbc:mysql://192.168.228.128:3306/ruozedata \
--username root \
--password root \
# 要导哪张表
--table sqoop_test \
# 给mapreduce job取个名字
--mapreduce-job-name mysql2hdfs \
# 设置map的个数
-m 1 \
# 如果目标目录存在,则先删除目标目录
--delete-target-dir \
# 指定要导那些字段
--columns "name,age,sex" \
# 指定导入到哪个hdfs目录
--target-dir sqoop_test_column_split_where \
# 字段与字段之间的分隔符
--fields-terminated-by '|' \
# 字符串类型的字段为null时的处理
--null-string '' \
# 非字符串类型的字段为null时的处理
--null-non-string '0' \
# where条件
--where 'id > 3'
(2)使用自定义query sql来导数据
# 注意点:
(2.1)--query不能与--table一起使用,且如果指定了----columns,要与--query中的内容保持一致
(2.2)--query的sql语句带where条件的,都需要加 and $CONDITIONS 这个,否则报错
(2.3)--query的sql语句带where条件的,如果是用单引号包起来的,是加 and $CONDITIONS 如果是双引号的 是加 and \$CONDITIONS
也就是要转义,否则还会报没有$CONDITIONS的错误,如下图
sqoop import \
--connect jdbc:mysql://192.168.228.128:3306/ruozedata \
--username root \
--password root \
--mapreduce-job-name mysql2hdfs \
-m 1 \
--delete-target-dir \
--columns "name,age,sex" \
--target-dir sqoop_test_column_split_query \
--fields-terminated-by '|' \
--null-string '' \
--null-non-string '0' \
# --query不能与--table一起使用,且如果指定了----columns,要与--query中的内容保持一致
--query 'select name,age,sex from sqoop_test where id <4 and $CONDITIONS'
(3)不带主键的表
# 注意点:
(3.1)没有主键的表在导数时,需要通过--split-by来指定哪个字段作为split或者通过-m 1指定map的个数为1 ,否则报错,如下图
sqoop import \
--connect jdbc:mysql://192.168.228.128:3306/ruozedata \
--username root \
--password root \
--table sqoop_test_no_primary_key \
--mapreduce-job-name mysql2hdfs \
--delete-target-dir \
--columns "name,age,sex" \
--target-dir sqoop_test_column_split_query \
--fields-terminated-by '|' \
--null-string '' \
--null-non-string '0' \
--split-by 'sex' \
-m 2
三、使用参数文件代替一大串命令行
参考官网:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_using_options_files_to_pass_arguments
# 使用示例:
[hadoop@hadoop tmp]$ sqoop --options-file /home/hadoop/tmp/sqoop_test_no_primary_key_import.txt