开发者学堂课程【Sqoop 企业级大数据迁移方案实战:导入 Import--表子集数据导入】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/718/detail/12837
导入 Import--表子集数据导入
内容介绍:
一、where 过滤
二、query 过滤
子集为表当中数据的一部分。之前进行表数据导入的操作的时候,相当于于把表中数据全部导入。在企业中往往有需求,比如导入雇员表,固定编号1204之后的,比如1204是18年入职的,后面有哪些人入职,这时在导入数据的时候就可以加入一些简单条件过滤一下比如说薪水大于5000的人,这些 sqoop 可以帮我们完成。在 sqoop 中支持两种方式进行表数据子集的导入,一种比较简单叫作 where 条件过滤,另一比较复杂叫作是 query 查询过滤,相当于并列一个 sql 。
一、where 过滤
where 条件过滤这种导入子集的方式是在 sqoop 语言当中加上一个参数叫作 --where , where 后面往往可以跟着一个条件 select 新发现一张表 where 等于多少或者 where 大于多少,相当于在执行在执行关系型数据库导入数据的时候会跟上条件,把满足这个条件的数据保留下来进行导入操作。
--where 可以指定从关系数据库导入数据时的查询条件。他执行在数据库服务器相应的 SQL 查询,并将结果存储在 HDFS 的目标目录。
bin/sqoop import\
(表示数据的导入)
--connect jdbc:mysql://node-1:3306/sqoopdb\
--username root\
--password hadoop\
--where“city=‘sec-bad’”\
--target –dir /wherequery\
--table emp_add—m1
首先 bin/sqoop import\表示数据的导入,emp_add 为地址表,首先并不是把所有的数据全部导入,其中加了一个条件 —where“city=‘sec-bad’,city 为表中的一个字段,相当于我们在导入表序中加一个条件,只把满足 city=‘sec-bad 的条件过滤出来,导入到 wherequery ,看看能否满足过滤所谓的子集数据。打开 sqoop 脚本,从脚本中复制相关信息,然后打开 sqoop 进行一个执行,我们只关注结果导入了几条以及导入的数据对不对,
发现之后只有三个记录,从数量上看是没有问题的,但是内容不一定正确,
接下来打开 HDFS 页面
在 wherequery 路径下进行一个查询,发现有标识,打开 wherequery 然后把他下载下来,进行验证,city 字段全部都是 city=‘sec-bad ,打开发现没有问题,说明其他不满足的数据就被过滤掉了。
文件中的一些数据就是 sqoop 表格中数据的部分子集。但是这种过滤比较简单,所发挥的功能也比较有限。如果wherequery 表中还有更多的需求,比如个人隐私不希望出现,只想看他的 id 、和他所在城市等等,这时候用 where 表达就比较复杂,这个时候就需要使用 query 查询。
二、query 过滤
Query 查询本质是在查询导入时执行一个 SQL 语句,只不过在 sqoop 中--query 有非常多的限制,如果不按照要求来,就会报错。
注意事项:
使用 query sql 语句来进行查找,不能加参数--table
并且需要添加 where 条件;
并且 where 条件后面必须带一个 $CONDITIONS 这个字符串
并且这个 sql 语句必须用单引号,不能用双引号:
bin/sqoop import\
(表示数据的导入)
--connect jdbc:mysql://node-1:3306/sqoopdb\
--username root\
--password hadoop\
--target
–dir /wherequery12\
(导出路径)
--query
‘select id,name,deg from emp WHERE id>1203 and $CONDITIONS’\
--split-by id\
--fields-terminated-by
’\t’\
--m2
在 sqoop 命令中, -- split-by id 通常配合 —m10 参数使用。用于制定根据哪个字段进行划分并启动多个 maptask 。
有了 --query ‘select id,name,deg from emp WHERE id>1203 and $CONDITIONS’\不再需要--table,已经出现在了 query 语句当中,上面已经有了表名。存储位置已经加入了query 语句,from 后面有了表名,所以不需要再加表名。
select id,name,deg from emp 为雇员信息表,只需要 id,name,deg 这几列,加上条件 where>1203表示只需要表格中1204,1205这两个,但是后面的语法与标准的 sql 语法不太一样,必须要添加 where 条件, where 条件后面必须添加$CONDITIONS 字符串, sql 语句必须用单引号,不能用双引号。有一个条件不一样就会进行报错
没有 where 条件时,比如导出数据时不需要大于210几,可以写一个 where id>1,最好的方式为后面写一个 where1=1,这样就不判断永远满足,但是要迎合前面那些条件。但是四个注意事项必须牢牢记住。
实现子表集的导出,只导出当中的某些字段。打开脚本,复制相关的命令,打开 sqoop 进行相关命令的执行操作,要保证 ip 端口,用户名,路径保持一致,最后导入两条记录。数量正确,查看内容只需要 id,name,deg 这三个字段,到达导出路径确认 wherequery 页 ,打开 web 页面,
首先发现上面两个文件,说明刚才设置的并行路产生的效果,采用两个并行导出,这里需要结合具体的操作环境。下载下来进行相关的验证。这样就完成了相关数据子集的导出操作。
第一个字段,分隔符为-001,第二个字段,第三个字段,很好导入。
这样就完成了指定的子集,而且是指定的字段,指定 id 大于的标准,指定的分隔符,这样就完成了数据的子集的导出操作。结合环境来具体改变,尤其是进行 wherequery 的时候需要的几个条件一定要注意。