Hadoop离线_Sqoop的使用

1246-谭同学

发表文章数:140

热门标签

,
首页 » 大数据 » 正文


1.Sqoop数据导入

首先可以用命令行查看帮助bin/sqoop help

Available commands:
可用命令:

codegen            Generate code to interact with database records
				   生成与数据库记录交互的代码
				   
create-hive-table  Import a table definition into Hive
				   将表定义导入到Hive中
				   
eval               Evaluate a SQL statement and display the results
				   计算一个SQL语句并显示结果
				   
export             Export an HDFS directory to a database table
				   将HDFS目录导出到数据库表
				   
help               List available commands
				   罗列出可用的命令
				   
import             Import a table from a database to HDFS
				   将一个表从数据库导入到HDFS
				   
import-all-tables  Import tables from a database to HDFS
				   将一些表从数据库导入到HDFS
				   
import-mainframe   Import datasets from a mainframe server to HDFS
				   从大型机服务器导入数据集到HDFS
				   
job                Work with saved jobs
				   用保存的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
				   运行一个独立的Sqoop metastore
				   
version            Display version information
				   显示版本信息

1.列出本地主机所有的数据库,可以用bin/sqoop listdabases --help查看帮助

2.bin/sqoop list-databases --connect jdbc:mysql://192.168.0.106:3306/ --username root --password自己数据库的密码 显示数据库

java.sql.SQLException: null, message from server: “Host ‘192.168.0.30’ is not allowed to connect to this MySQL server”
注意:如果出现这种异常,需要给自己连接的mysql授予远程连接权限

3.bin/sqoop list-tables --connect jdbc:mysql://192.168.0.106:3306/userdb --username root --password123456 显示数据库中的表

4.bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --username root --password 123456 --table emp --m 1将mysql数据库userdb中的emp表导入到hdfs中(–table指要选择哪个表,–m指MapTask的个数)

5.bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --username root --password 123456 --table emp --delete-target-dir --target-dir /sqoop/emp --m 1 将emp表导入到hdfs指定文件夹(–delete-target-dir判断导出目录是否存在,如果存在就删除 –target-dir指定导出目录)

6.bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp --delete-target-dir --target-dir /sqoop/emp2 --username root --password 123456 --fields-terminated-by '/t' --m 1指定分隔符

2.导入关系表到Hive已有表中

1.想要将mysql中的表数据直接导入到Hive,必须先将Hive下lib目录中的一个jar包hive-exec-1.1.0-cdh5.14.0.jar复制到sqoop的lib目录下 cp /export/servers/hive-1.1.0-cdh5.14.0/lib/hive-exec-1.1.0-cdh5.14.0.jar /export/servers/sqoop-1.4.6-cdh5.14.0/lib/

2.然后现在hive中创建一个sqooptohive的数据库,并在其中创建一个用来存放数据的表
CREATE DATABASE sqooptohive;
USE sqooptohive;

CREATE EXTERNAL TABLE emp_hive(
id INT,
name STRING,
deg STRING,
salary INT,
dept STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '/001';

3.bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp --delete-target-dir --target-dir /sqoop/emp2 --fields-terminated-by '/001' --username root --password 123456 --hive-import --hive-table sqooptohive.emp_hive --hive-overwrite --m 1从mysql向hive导入表数据(–hive-overwrite 表示如果有重名的表,则覆盖掉)

hive需要配置环境变量

3.导入关系表到Hive(自动创建Hive表)

bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp-conn --username root -password 123456 --hive-import --hive-database sqooptohive --m 1

4.将关系表子集导入到HDFS中

bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp_add --delete-target-dir --target-dir /sqoop/emp_add --username root --password 123456 --where "city='sec-bad'" --m 1

5.sql语句查找导入到HDFS

bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --delect-target-dir --target-dir /sqoop/emp_conn --username root --password 123456 --query 'select phon from emp_conn where 1=1 and $CONDITIONS' --m 1使用sql语句查询首先不能有–table,其次–query后面跟着的sql语句必须用单引号,必须要有where条件,没有筛选条件就用WHERE 1=1,后面必须跟一个$CONDITIONS字符串

6.两种增量导入方式

实际工作中,很少有需要将整张表的数据导入到Hive或者HDFS,一般只需要导入增量数据。增量导入是仅导入新添加的表中的行的技术。一般情况下,每个数据表都会有三个固定字段:create_time,update_time,is_delete。可以根据创建时间和更新时间来解决增量导入数据的需求
Sqoop也考虑到了这种情况,提供了三个参数来帮助实现增量导入:
--incremental <mode>   --check-column <column name>   --last value <last check column value>

1.第一种增量方式
需求:导入emp表当中id大于1202的所有数据
bin/sqoop import --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp --target-dir /sqoop/increment --incremental append --check-column id --last-value 1202 --username root --password 123456 --m 1
增量导入的时候,一定不能加参数–delete-target-dir,否则会报错。–incremental有两种mode:append / lastmodified。–check-column需要的值是用来做增量导入判断的列名(字段名)。–last-value是指定某一个值,用于标记增量导入的位置。

2.第二种增量方式
需求:导入emp表中创建时间在2020.3.7且is_delete=1的数据
bin/sqoop import --connect jdbc:mysql://192.168.0.106/userdb --table emp --target-dir /sqoop/increment2 --incremental append --where "create_time > '2020-3-7 00:00:00' and create_time < '2020-3-7 23:59:59' and is_delete = '1'" --check-column id --username root --password 123456 --m 1
本来想的有了where来查询就可以不用–check-column参数,没想到只要是增量导入就必须要有这个参数

3.思考一下如何解决减量数据的需求?
减量数据的删除是假删除,不是真删除,其实就是改变了数据的状态,数据的更新时间也会同步改变。所以解决减量数据实际上就涉及到了数据的变更问题,只要变更数据,update_time也会发生改变,更新数据的时候,就是要根据create_time和update_time一起来判断,只要符合其中任意一项就将数据导入到Hive或者HDFS上,那么就有可能出现两条id相同,create_time相同的数据,比如:

id		create_time			update_time
1		2020-1-3 12:12:12	2020-1-3 12:12:12
1		2020-1-3 12:12:12	2020-1-13 12:12:12

可以用group by id进行分组,将id相同的分到一组,取update_time最新的数据

7.Sqoop的数据导出

bin/sqoop export --connect jdbc:mysql://192.168.0.106:3306/userdb --table emp_out --export-dir /sqoop/emp --input-fields-terminated-by ',' --username root --password 123456

8.常用命令中文详解

1.常用命令
Hadoop离线_Sqoop的使用

2.数据库连接
Hadoop离线_Sqoop的使用

3.import
Hadoop离线_Sqoop的使用

4.export
Hadoop离线_Sqoop的使用

5.hive
Hadoop离线_Sqoop的使用

6.关系表导入import
Hadoop离线_Sqoop的使用

7.关系表导出export
Hadoop离线_Sqoop的使用

8.create-hive-table
Hadoop离线_Sqoop的使用

9.job
Hadoop离线_Sqoop的使用

10.merge
Hadoop离线_Sqoop的使用

未经允许不得转载:作者:1246-谭同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《Hadoop离线_Sqoop的使用》 发布于2021-02-10

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录