项目数仓
数仓(Data Warehouse)是指用于存储和管理企业数据的一种大型数据库系统,以支持企业的决策分析活动。它采用了ETL(抽取、转化、加载)等技术来集成和清洗数据,并提供了灵活的查询和报表功能,使得分析师和决策者可以更好地理解企业的业务情况和趋势。
项目工具
hue
进入hue
操作hdfs
进入hdfs管理界面
操作目录
增、删、改、查。
操作文件
增、删、改、查。
操作hive
sqoop 重点重点重点
1 基本使用操作
如何查看 sqoop的 帮助文档
sqoop help sqoop --help
2- 查询命令的参数有哪些?
sqoop list-databases --help
3- 查询mysql中所有的库有那些?
4- 查询mysql中scm中所有的表
sqoop list-tables \ --connect jdbc:mysql://hadoop01:3306/scm \ --username root \ --password 123456
2 数据全量导入操作
准备工作
create database test default character set utf8mb4 collate utf8mb4_unicode_ci; use test; create table emp ( id int not null primary key, name varchar(32) null, deg varchar(32) null, salary int null, dept varchar(32) null ); INSERT INTO emp (id, name, deg, salary, dept) VALUES (1201, 'gopal', 'manager', 50000, 'TP'); INSERT INTO emp (id, name, deg, salary, dept) VALUES (1202, 'manisha', 'Proof reader', 50000, 'TP'); INSERT INTO emp (id, name, deg, salary, dept) VALUES (1203, 'khalil', 'php dev', 30000, 'AC'); INSERT INTO emp (id, name, deg, salary, dept) VALUES (1204, 'prasanth', 'php dev', 30000, 'AC'); INSERT INTO emp (id, name, deg, salary, dept) VALUES (1205, 'kranthi', 'admin', 20000, 'TP'); create table emp_add ( id int not null primary key, hno varchar(32) null, street varchar(32) null, city varchar(32) null ); INSERT INTO emp_add (id, hno, street, city) VALUES (1201, '288A', 'vgiri', 'jublee'); INSERT INTO emp_add (id, hno, street, city) VALUES (1202, '108I', 'aoc', 'sec-bad'); INSERT INTO emp_add (id, hno, street, city) VALUES (1203, '144Z', 'pgutta', 'hyd'); INSERT INTO emp_add (id, hno, street, city) VALUES (1204, '78B', 'old city', 'sec-bad'); INSERT INTO emp_add (id, hno, street, city) VALUES (1205, '720X', 'hitec', 'sec-bad'); create table emp_conn ( id int not null primary key, phno varchar(32) null, email varchar(32) null ); INSERT INTO emp_conn (id, phno, email) VALUES (1201, '2356742', 'gopal@tp.com'); INSERT INTO emp_conn (id, phno, email) VALUES (1202, '1661663', 'manisha@tp.com'); INSERT INTO emp_conn (id, phno, email) VALUES (1203, '8887776', 'khalil@ac.com'); INSERT INTO emp_conn (id, phno, email) VALUES (1204, '9988774', 'prasanth@ac.com'); INSERT INTO emp_conn (id, phno, email) VALUES (1205, '1231231', 'kranthi@tp.com');
在mysql中创建3张表
5.1 需求一: 将 mysql中的emp表中数据导入到HDFS中
方式一 不指定导入位置
sqoop import \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --table emp
方式二 指定导入位置
sqoop import \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --table emp \ --delete-target-dir \ --target-dir /sqoop_works/emp
基础
实现
sqoop import \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --table emp \ --delete-target-dir \ --target-dir /sqoop_works/emp
方式三 设置其mapTask的数量呢
sqoop import \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --table emp \ --delete-target-dir \ --target-dir /sqoop_works/emp \ --split-by id \ -m 1
基础
方式四 设置字段之间的分割符
基础知识
--fields-terminated-by
实现
5.2 需求二 将 emp_add 这个表的全部数据导入到HIVE的对应表中
第一步: 在HIVE中创建目标表
create database if not exists db_1; create table if not exists db_1.emp_add( id int, hno string, street string, city string ) row format delimited fields terminated by '\t' stored as orc;
第二步: 编写 sqoop命令 完成数据导入操作
sqoop import \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --table emp_add \ --fields-terminated-by '\t' \ --hcatalog-database 'db_1' \ --hcatalog-table 'emp_add' \ -m 1
第三步: 在datagrip中测试
注意
3 数据条件导入数据 重点
方式一: 通过 where条件的方式, 将部分数据导入到HDFS中
1- 以 emp为例, 在这个表中, 新增一条数据, 尝试将这一条数据导入到HDFS中
INSERT INTO test.emp VALUES(1206,'zhangsan','bigdata dev','30000','TP');
2- 通过 sqoop实现数据条件导入
sqoop import \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --table emp \ --where 'id > 1205' \ --delete-target-dir \ --target-dir /sqoop_works/emp_1 \ --fields-terminated-by '|' \ -m 1
注意: --where 'xxx=yyy' 条件必须加单引号
方式二: 通过 SQL的方式, 将部分数据导入到HDFS中:
1- 以 emp为例, 在这个表中, 新增一条数据, 尝试将这一条数据导入到HDFS中
INSERT INTO test.emp VALUES(1207,'lisi','bigdata dev','50000','TP');
2- 使用sqoop条件导入数据: 采用 SQL形式
sqoop import \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --query 'select * from emp where id > 1206 and $CONDITIONS' \ --delete-target-dir \ --target-dir /sqoop_works/emp_2 \ --fields-terminated-by '|' \ -m 1
注意
1- 当使用 --query 方式的时候, 不允许在使用 --table, 因为 SQL中已经明确需要导入那个表的数据 2- 当使用 --query 方式的时候, 编写的SQL语句必须添加where条件, 条件最后必须要跟 $CONDITIONS, 如果使用双引号包裹SQL, $前面必须加一个 \ 进行转义操作, 当如果没有条件的时候,建议写成: where 1=1 and $CONDITIONS
如何导入HIVE呢? 以其中SQL为例
1- 先在mysql中, 新增一条数据:
INSERT INTO test.emp_add VALUES(1206,'412Q','aoc','sec-bad');
2- 使用 sqoop 完成导入操作
sqoop import \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --query 'select * from emp_add where id = 1206 and $CONDITIONS' \ --hcatalog-database 'day03_xls' \ --hcatalog-table 'emp_add' \ --fields-terminated-by '\t' \ -m 1
4 数据全量导出操作 重点
需求: 将HIVE中 emp_add表中所有的数据全量导出MySQL中
步骤一: 在MySQL中创建目标表
CREATE TABLE test.tb_emp_add_hive2mysql ( id INT, hno VARCHAR(20), street VARCHAR(20), city VARCHAR(20) );
步骤二: 执行sqoop导出操作
sqoop export \ --connect jdbc:mysql://hadoop01:3306/test \ --username root \ --password 123456 \ --table tb_emp_add_hive2mysql \ --fields-terminated-by '\t' \ --hcatalog-database 'db_1' \ --hcatalog-table 'emp_add' \ -m 1
注意
5 相关参数
-- null-string 和 --null-non-string 主要用于将数据源中 NULL数据,转换为 空