sqoop1.4.7 从MySQL导入数据到HDFS

准备

启动 hadoop

cd /program
bin/hadoop.sh

全部导入

将MySQL某表所有字段、所有数据,导入到 HDFS

cd sqoop-1.4.7
bin/sqoop import \
--connect jdbc:mysql://hadoop1:3306/scott \
--table dept \
--username root \
--password root \
--target-dir /test_sqoop_dept \
--fields-terminated-by '\t' \
--m 1 \
--null-string ''

注意

参数名和参数值中间只能有一个空格,否则可能报错

如下:

--password   root  # 前面多出空格,会报密码错误
--target-dir    /test_sqoop_dept   # 前面多出空格,生成的目录只有空格

查看数据

访问 http://hadoop1:9870/

查看文件:/test_sqoop_dept/part-m-00000

内容如下:

3    市场部    北京
10    ACCOUNTING    NEW YORK
20    RESEARCH    DALLAS
30    SALES    CHICAGO
40    OPERATIONS    BOSTON
60    测试部    NEW YORK

导入指定列

将MySQL某表 指定列、所有数据,导入到 HDFS

cd sqoop-1.4.7
bin/sqoop import \
--connect jdbc:mysql://hadoop1:3306/scott \
--table dept \
--columns deptno,dname \
--username root \
--password root \
--target-dir /test_sqoop_dept2 \
--fields-terminated-by '\t' \
--m 1

查看数据

访问 http://hadoop1:9870/

查看文件:/test_sqoop_dept2/part-m-00000

内容如下:

3    市场部
10    ACCOUNTING
20    RESEARCH
30    SALES
40    OPERATIONS
60    测试部

查询条件导入

将MySQL某表 指定列,指定 where 查询条件,将查询结果导入到 HDFS

cd sqoop-1.4.7
bin/sqoop import \
--connect jdbc:mysql://hadoop1:3306/scott \
--table dept \
--columns deptno,dname \
--where "deptno <= 30" \
--username root \
--password root \
--target-dir /test_sqoop_dept3 \
--fields-terminated-by '\t' \
--m 1

查看数据

访问 http://hadoop1:9870/

查看文件:/test_sqoop_dept3/part-m-00000

内容如下:

3    市场部
10    ACCOUNTING
20    RESEARCH
30    SALES

查询SQL导入(一个map任务)

应用场景:通过 select 查询语句,将结果导入到HDFS,适用于:关联查询、统计查询

cd sqoop-1.4.7
bin/sqoop import \
--connect jdbc:mysql://hadoop1:3306/scott \
--username root \
--password root \
--target-dir /test_sqoop_emp \
--fields-terminated-by '\t' \
--m 1 \
--null-string '' \
--query 'select a.ename,b.dname from emp a,dept b where a.deptno = b.deptno and sal>2000 and $CONDITIONS'

解释:

  • $CONDITIONS:实现并行运行mr的功能,必须加 $CONDITIONS。这里只有一个 map 任务

查看数据

访问 http://hadoop1:9870/

查看文件:/test_sqoop_emp/part-m-00000

内容如下:

7566    JONES    MANAGER    7839    1981-04-02    2975.00    null    20
7698    BLAKE    MANAGER    7839    1981-05-01    2850.00    null    30
7782    CLARK    MANAGER    7839    1981-06-09    2450.00    null    10
7788    SCOTT    ANALYST    7566    1987-04-19    3000.00    null    20
7839    KING    PRESIDENT    null    1981-11-17    5000.00    null    10
7902    FORD    ANALYST    7566    1981-12-03    3000.00    null    20

查询导入(多个map任务)

有多个maptask,需使用 --split-by 来区分数据,$CONDITIONS 替换查询范围

bin/sqoop import \
--connect jdbc:mysql://hadoop1:3306/scott \
--username root \
--password root \
--target-dir /test_sqoop_emp2 \
--fields-terminated-by '\t' \
--null-string '' \
--m 2 \
--query 'select empno,ename,job,sal,deptno from scott.emp where sal>2000 and $CONDITIONS' \
--split-by empno

解释:

  • $CONDITIONS:实现并行运行mr的功能,必须加 $CONDITIONS

  • --split-by:区分数据

执行结果

可以看出,显示查询 empno 的最大值 7566 、最小值 7902,然后根据 maptask任务数,分成2个任务,各自导入数据

查看数据

访问 http://hadoop1:9870/

查看目录:/test_sqoop_emp2/part-m-00000 有以下2个文件:

  • part-m-00000
  • part-m-00001

part-m-00000 内容如下:

7566    JONES    MANAGER    2975.00    20
7698    BLAKE    MANAGER    2850.00    30

part-m-00001 内容如下:

7782    CLARK    MANAGER    2450.00    10
7788    SCOTT    ANALYST    3000.00    20
7839    KING    PRESIDENT    5000.00    10
7902    FORD    ANALYST    3000.00    20

原文出处:/show_1IX3WvqX3NPc.html