目录

数据定义

数据仓库操作

数据仓库的创建

数据仓库的查询

数据仓库的修改

数据仓库的删除

表操作

内部表

外部表

分区表

桶表

表的修改

表的删除

视图

数据操作

数据导入

加载数据

插入数据

数据导出

HQL查询

数据准备

select查询

where语句

模糊查询

分组查询

join

排序


在上一节大数据实训笔记9:hive的安装部署的基础上,我们这一节来介绍如何使用hive。

数据定义

数据仓库操作

下面我们用JDBC访问的方式来介绍一下hive数据仓库的基础应用。

[hadoop@hadoop101 hive-3.1.2]$ bin/beeline -u jdbc:hive2://hadoop101:10000 -n hadoop

数据仓库的创建

create database [if not exists] 数据库名 location <路径>

首先来创建一个数据库bigdata。

create database if not exists bigdata;

我们可以访问 http://hadoop101:9870 ,进入/user/hive/warehouse/查看。

数据仓库的查询

对数据仓库的查询包括查询数据仓库的个数和查看数据仓库的详情等。查看数据仓库的详细信息要使用关键字extended。

//显示数据仓库
show databases;

//过滤显示查询的数据仓库
show databases like 'big*';

//查看数据仓库的详情
desc database extended bigdata;

//切换数据仓库
use bigdata;

数据仓库的修改

用户可以使用alter命令修改数据仓库的Dbproperties键值对的属性值,来描述这个数据仓库的属性信息。数据仓库其他的元数据信息都是不可更改的,包括数据仓库名和数据仓库所在存储的位置。

alter database bigdata set dbproperties("createtime"="20220707");
desc database extended bigdata;

数据仓库的删除

drop database [if exists] 数仓名 [cascade];
//删除数据仓库
drop database bigdata;
//如果存在则删除数据仓库
drop database if exists bigdata;
//级联删除数据仓库
drop database bigdata cascade;

表操作

在hive中,表都在HDFS的相应目录中存储数据。目录的名称是在创建表的时自动创建以表名来命名的,表中的数据都保存在此目录中。数据以文件形式存储在HDFS中。

表的元数据会存储在数据库中,可以是derby数据库或MySQL数据库。

Create table [if not exists] 表名
(列名1 数据类型 [comment列注释],........)
[comment表的注释]
[partition by(列名,.....)]        //分区表
[clustered by(列名,.....)]        //创建桶表
[sorder by(列名[asc|desc])]       //排序
[row format delimited 格式]       //分隔符
[stored as 文件格式]              //表文件的存储格式
[location hdfs路径]               //hdfs存储位置

内部表

不带external关键字创建的表是管理表,有时也称为内部表。hive表是归属某个数据仓库的,默认情况下hive会将表存储在default数据仓库中,也可以使用use命令切换数据仓库,将所创建的表存储在切换后的数据仓库中。删除内部表时,表的元数据和表数据文件会同时被删除。

先来看一个简单的案例。在hive数据仓库bigdata中创建内部表test,将本地文件的数据test.txt导入到表中。

//创建本地文件test.txt
[hadoop@hadoop101 hive-3.1.2]$ mkdir data
[hadoop@hadoop101 hive-3.1.2]$ cd data
[hadoop@hadoop101 data]$ vim test.txt

注意,下面的数据之间以\t(tab)隔开。 直接复制很可能出错,导入数据会显示null,因此大家最好自己手打。

1001    Alice
1002    Bob
1003    Caroline
1004    Delores
1005    Ethan
1006    Floyd
//创建bigdata数据仓库
create database if not exists bigdata;
//切换数据仓库
use bigdata;
//创建表
create table test(id int,name string)
row format delimited fields terminated by '\t';
//导入数据
load data local inpath '/opt/module/hive-3.1.2/data/test.txt' into table test;
//查询结果
select * from test;

查询结果,导入成功。

接下来我们看另一个案例,需要在hive数据仓库bigdata中创建复杂数据类型(Array, Map, Struct)内部表complex,将本地文件的数据complex.txt导入到表中。

//创建本地文件complex.txt
[hadoop@hadoop101 data]$ vim complex.txt

注意,不要有其他多余的符号和空格!

Alice,Bob_Caroline,Delores:23_Ethan:24,NewYork_USA
Floyd,Grace_Helen,Ian:25_James:23,London_England

创建表如下:

create table complex(
name string,
friends array<string>,
partners map<string,int>,
address struct<city:string,country:string>)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':';
//导入数据
load data local inpath '/opt/module/hive-3.1.2/data/complex.txt' into table complex;
//查看
select * from complex;

我们还可以创建指定目录的内部表。(这个目录是http://haoop101:9870上的)

create table if not exists test2(id int, name string) row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/test2';
desc formatted test2;

外部表

带external关键字创建的表是外部表。外部表和内部表在元数据组织上都是一样的。

在hive数据仓库bigdata中创建外部表dept,将本地文件的数据dept.txt导入到表中。

[hadoop@hadoop101 data]$ vim dept.txt

注意,下面的数据之间以\t(tab)隔开。

101     计算机学院      2100
102     数学学院        2200
103     外国语学院      2300
104     化学学院        2400
105     新闻媒体学院    2500
create external table if not exists dept(
deptno int,
dname string,
snum int)
row format delimited fields terminated by '\t';
//导入数据
load data local inpath '/opt/module/hive-3.1.2/data/dept.txt' into table dept;
//设置字符编码,否则会出现乱码
alter table dept set serdeproperties('serialization.encoding'='utf-8');
//查看
select * from dept;

内部表和外部表之间还可以相互转换。注意下面括号里的部分必须要大写。

alter table 表名 set tblproperties('EXTERNAL'='TRUE|FALSE');
//将内部表转为外部表
//区分大小写!!!括号里的部分必须大写
alter table test2 set tblproperties('EXTERNAL'='TRUE');

分区表

hive中的分区表就是分目录,把一个大的数据集根据业务需要分割成小的数据集。

create table if not exists dept2(deptno int, dname string, snum int)
partitioned by(month string)
row format delimited fields terminated by '\t';
load data local inpath '/opt/module/hive-3.1.2/data/dept.txt' into table dept2 partition(month='202201');
load data local inpath '/opt/module/hive-3.1.2/data/dept.txt' into table dept2 partition(month='202202');
load data local inpath '/opt/module/hive-3.1.2/data/dept.txt' into table dept2 partition(month='202203');

我们到浏览器上查询结果,分区表创建成功。

//单分区查询
select deptno,dname,snum from dept2 where month='202201';
//多分区联合查询
select deptno,dname,snum from dept2 where month='202201'
union
select deptno,dname,snum from dept2 where month='202202'
union
select deptno,dname,snum from dept2 where month='202203';

桶表

桶表就是将数据分解成更容易管理的若干部分。

create table bucket(
id int,
name string)
clustered by(id)
row format delimited fields terminated by '\t';
//设置桶表属性
set hive.enforce.bucketing=true;
set mapreduce.job.reduces=-1
//插入数据
insert into table bucket select id, name from test;

表的修改

hive表是可以修改的,包括表名、修改列名、增加列、删除或替换列等,但不提倡使用。

//查看表信息
desc dept1;
//重命名
alter table dept rename to dept1;
//修改列名
alter table 表名 change 旧列名 新列名 新列名的数据类型;alter table dept1 change snum stu_num int;
//增加或替换列
alter table 表名 add|replace columns(列名 列名数据类型, ...);alter table dept1 add columns(create_date string);

表的删除

drop table [if exists] 表名;//删除表
drop table dept1;

视图

//创建视图
create view test_view as select * from test;
//查询视图
select * from test_view;
//删除视图
drop view test_view;

数据操作

hive数据操作包含load、insert、update、delete等。不要频繁的使用update和delete操作,这样会违背了hive的初衷。

数据导入

加载数据

load data [local] inpath '数据路径' [overwrite] into table 表名;

导入本地数据的操作在前文创建表中已经演示了,大家可以回去看一下。下面我们介绍其他的数据导入操作。

//将本地文件上传到hdfs
[hadoop@hadoop101 data]$ hdfs dfs -mkdir /user/hive/warehouse/data
[hadoop@hadoop101 data]$ hdfs dfs -put test.txt /user/hive/warehouse/data
create table test3(
id int,
name string)
row format delimited fields terminated by '\t';
//加载hdfs文件到hive表中
load data inpath '/user/hive/warehouse/data/test.txt' into table test3;
//查看
select * from test3;

注意,加载hdfs文件到hive表中,hdfs中的相应文件会自动被删除,大家可以到浏览器上查看。

接下来我们再上传一个test2.txt文件,同样导入test3表中,覆盖之前的数据。

//创建test2.txt文件,和test.txt相似,随便修改几个数据就好了
[hadoop@hadoop101 data]$ vim test2.txt
//将test2.txt上传到hdfs
[hadoop@hadoop101 data]$ hdfs dfs -put test2.txt /user/hive/warehouse/data
//加载数据并覆盖
load data inpath '/user/hive/warehouse/data/test2.txt' overwrite into table test3;
//查看
select * from test3;

可以看到数据和刚刚不同,说明被成功覆盖。

插入数据

insert into table test3(id, name) values(1007, "Grace"),(1008, "James");

如果insert语句没有报错,但是卡住了,可以先退出hive,重新进入。输入下列命令,再此执行insert语句,应该就可以成功。

set hive.exec.mode.local.auto=true;    //设置为本地模式

数据导出

//创建test3.txt,用来存放导出的数据
[hadoop@hadoop101 data]$ touch test3.txt
//导出数据到本地,目标文件有则覆盖,无则写入
insert overwrite local directory '/opt/module/hive-3.1.2/data/test3.txt' select * from test3;
//导出数据到hdfs
insert overwrite directory '/user/hive/warehouse/data/test1'
row format delimited fields terminated by '\t'
select * from test3;
//使用export导出数据到hdfs
export table test3 to '/user/hive/warehouse/data/test2';

HQL查询

数据准备

以下数据均以\t为分隔符,注意复制后要调整一下!

[hadoop@hadoop101 data]$ vim dept.txt
101     人事部
102     财务部
103     研发部
104     市场部
105     后勤部
[hadoop@hadoop101 data]$ vim emp.txt
1001    Alice   F       23      25000   101
1002    Bob     M       22      20000   103
1003    Cathy   F       24      20000   102
1004    Debbie  F       23      15000   102
1005    Ethan   M       25      16000   103
1006    Floyd   M       24      12000   105
//创建表dept
create table dept(
dno int,
dname string)
row format delimited fields terminated by '\t';
//加载数据到dept表
load data local inpath '/opt/module/hive-3.1.2/data/dept.txt' into table dept;
//查看
select * from dept;

//创建表emp
create table emp(
eno int,
ename string,
sex string,
age int,
salary int,
dno int)
row format delimited fields terminated by '\t';
//加载数据到emp表
load data local inpath '/opt/module/hive-3.1.2/data/emp.txt' into table emp;
//查看
select * from emp;

select查询

select [all|distinct]列名1,列名2,.....
from 表名
[where 条件]
[group by 列名1,列名2,.....]
[having 分组条件]
[order by 列名....]
[limit 数据]
....

全表查询刚刚已经演示过了,相信大家已经很熟悉了。下面我们演示其他的基础查询方式。

//查询特定列
select eno, ename from emp;

//查询并设置列的别名
select eno id, ename name from emp;

//limit限制查询返回的行数
select * from emp limit 2;

where语句

//查询工资为20000的员工信息
select * from emp where salary=20000;

//查询所有员工的编号、姓名及其所在的部门编号和姓名
select e.eno, e.ename, e.dno, d.dname from emp e, dept d where e.dno=d.dno;

//查询工资在17000-22000之间的员工信息
select * from emp where salary between 17000 and 22000;

//查询年龄为23或24的员工信息
select * from emp where age in (23, 24);

模糊查询

_表示任意一个字符,%表示任意个(包括零)字符。

//查询名字里有a的员工信息
select * from emp where ename like "%a%";

//查询名字第二个字母是a的员工信息
select * from emp where ename like "_a%";

//查询名字中有l的员工信息
select * from emp where ename rlike "[l]";

分组查询

//查询每个部门的平均工资、总工资、最高工资、最低工资
select d.dno, d.dname, avg(e.salary) avg_salary, sum(e.salary) sum_salary, max(e.salary) max_salary, min(e.salary) min_salary
from emp e, dept d
where e.dno=d.dno
group by d.dno, d.dname;

//查询部门表中平均工资大于18000的部门信息
select d.dno, d.dname, avg(e.salary) avg_salary
from emp e, dept d
where e.dno=d.dno
group by d.dno, d.dname
having avg_salary>18000;

//查询员工表中工资大于平均工资的员工信息
select *
from emp
where salary>(
select avg(e.salary)
from emp e);

join

hive只支持等值连接、外连接和左半连接。

//两表连接
select e.*, d.dname
from emp e join dept d
on e.dno = d.dno;

排序

hive 常用的排序方法有order by, sort by, distribute by, cluster by。

//两表连接后按照工资升序排序
select e.*, d.dname
from emp e join dept d
on e.dno = d.dno
order by e.salary asc;

大数据实训笔记10:hive的应用相关推荐

  1. 大数据实训笔记4:mapreduce

    目录 核心思想 Mapper Reducer Driver 数据类型 简单案例wordcount maven工程搭建 代码实现 在集群中测试 序列化 序列化和反序列化 自定义序列化 案例1:计算 案例 ...

  2. 大数据实训笔记1:hadoop环境搭建及单机模式

    必备环境 VMware Centos 7 SwitchHosts!(可以不用) SecureCRT hadoop-3.1.3.tar jdk-8u212-linux-x64.tar hadoop环境搭 ...

  3. 搭建高校AI大数据实训室,2019高校大数据科研教学整体解决方案,数道云

    伴随着互联网技术的迅猛发展,正在逐步改变传统的高校教育模式,以大数据.云计算.AI等等技术为核心的教育模式正在逐步发展. 高校实行AI大数据实训室有何实质性的效果呢? 大数据的出现催生出产业人才缺口瓶 ...

  4. 大数据实训室课程体系设计案例分享

    大数据课程体系 大数据实训课程体系设计依据 一.培养目标:大数据技术与应用专业主要培养大数据应用与工程技术领域的复合型高级技术人才.毕业生具有信息科学和数据科学基础知识与基本技能,掌握大数据技术所需要 ...

  5. 大数据实训基地建设方案分享

    大数据实训室建设方案 中高职及本科在大数据专业建设所遇到的困难 大数据.信息安全.人工智能等新信息技术产业发展迅猛,人才极其匮乏,各个本科及职业院校纷纷开设相应的专业方向.但是,绝大多数院校因为师资和 ...

  6. 大数据实训报告_教学大数据实训平台解决方案_德拓信息_上海市徐汇区

    大数据实训 方案简介 德拓开发出多套专业的教学体系,为大数据.云计算.AI等专业的师生提供全套完整的教学实训实战方案.DSight智慧实验室包括教学实训.项目实战.科研应用三大模块,同时还提供对应的课 ...

  7. 湖北高校实用的大数据平台,专业的高校大数据实训平台解决方案,波若高校实训平台...

    大数据工程教学实训平台又称大数据挖掘实战中心,将云存储资源.服务器资源和网络资源整合,然后通过Vmware等虚拟化搭建私有云平台,在私有云平台上搭建统一的数据挖掘平台和基于Hadoop的大数据分析平台 ...

  8. 大数据实训室助力国家高校人才梯队建设

    5天,60小时,不间断的持续学习,是什么内容使得已经工作多年的教师还能如此热情高涨的学习?答案就是:新华三大数据教师培训. 2016年11月21~25日,新华三集团在杭州总部举办"2016新 ...

  9. 【数据清洗预处理——四】使用大数据实训云

    数据清洗与预处理--四 大数据实训云 1.登录实训云 2 .进入实训云 创建网络 查看网络拓扑 创建路由 查看网络拓扑 连接网络 创建端口 添加安全组 创建实例 1.实例规划 2.开始创建 测试连通性 ...

最新文章

  1. 城市大脑全球标准研究2:如何理解和定义城市大脑?
  2. 《C++ primer》--第三章
  3. 导入依赖和加上注释后,lombok gettersetter识别不到
  4. SQL注入——基于布尔的盲注(八)
  5. python网站用什么数据库_PyMySQL数据库的使用
  6. .NET 7 预览版2 的亮点之 NativeAOT 回顾
  7. yuv编码成h264格式写成文件
  8. caffe学习笔记(1)
  9. poj(2406) kmp
  10. Linux系统编程—— fork() 函数详解
  11. 【图文教程】de4dot实战字符串解密(演示:hishop微分销系统)
  12. MATLAB函数的求导(一阶、高阶、参数方程求导实例)
  13. 大数据专业python实验报告_大数据导论实验报告
  14. css获取屏幕分辨率
  15. IPv6路由信息的序号
  16. 使用video.js 播放youtube视频——踩坑记1
  17. [Java]知乎下巴第4集:再把抓到篮子里的知乎塞到硬盘里吧
  18. MTK_android项目驱动设置
  19. 换流变压器设备GIM建模要求
  20. 【web攻防】破壳漏洞【CVE-2014-6271】与心脏滴血漏洞 【CVE-2014-0160】 docker 复现 学习过程

热门文章

  1. Nginx部署Vue项目动态路由刷新404
  2. 【Derivation】任何矩阵都相似与Jordan标准形证明
  3. 世界上根本没有黑天鹅
  4. deepin 安装显卡后,可支持双屏展示
  5. CANoe的数据回放(Replay Block),还是要结合CAPL脚本才能说的明白
  6. iOS审核用户隐私政策
  7. 太原理工大学系统分析与设计实验报告实验室设备_警钟长鸣!盘点国内高校实验室事故...
  8. 2019微生物组—宏基因组分析技术研讨会第四期
  9. GPRS联网过程简介
  10. 疯狂天才乔治·霍兹:17岁黑掉苹果,22岁搞垮索尼,还是特斯拉、谷歌最可怕的对手!