hive的操作

本文详细介绍了Hive数据库的创建、使用、删除,包括内部表和外部表的操作,如创建、加载数据、删除等。此外,还讲解了分区表、分桶表的概念和操作,以及数据类型和字段格式的设定,对于大数据处理和查询优化有重要指导意义。
摘要由CSDN通过智能技术生成

数据库操作

创建数据库

create database if not exists myhive;
use  myhive;

说明:hive的表存放位置模式是由hive-site.xml当中的一个属性指定的

<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>

创建数据库并指定hdfs存储位置

create database myhive2 location '/myhive2';

查看数据库详细信息

desc  database  myhive;

删除数据库

删除一个空数据库,如果数据库下面有数据表,那么就会报错

drop  database  myhive;

强制删除数据库,包含数据库下面的表一起删除

drop  database  myhive2  cascade; 

数据库表操作

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
   [(col_name data_type [COMMENT col_comment], ...)] 
   [COMMENT table_comment] 
   [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
   [CLUSTERED BY (col_name, col_name, ...) 
   [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
   [ROW FORMAT row_format] 
   [STORED AS file_format] 
   [LOCATION hdfs_path]

说明:
1、CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
2、EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
3、LIKE允许用户复制现有的表结构,但是不复制数据。
4、ROW FORMAT DELIMITED 可用来指定行分隔符
5、STORED AS SEQUENCEFILE|TEXTFILE|RCFILE 来指定该表数据的存储格式,hive中,表的默认存储格式为TextFile。
6、CLUSTERED BY
对于每一个表(table)进行分桶(MapReuce中的分区),桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
7、LOCATION: 指定表在HDFS上的存储位置。

hive的字段类型
在这里插入图片描述

内部表操作

内部表: 未被external修饰的是内部表(managed table),内部表又称管理表,内部表数据存储的位置由hive.metastore.warehouse.dir参数决定(默认:/user/hive/warehouse),删除内部表会直接删除元数据(metadata)及存储数据,因此内部表不适合和其他工具共享数据。

创建内部表

create database if not exists myhive;
use myhive;
create table stu(id int,name string);
insert into stu values (1,"zhangsan");
select * from stu;

创建表并指定字段之间的分隔符

create  table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t';

根据查询结果创建表

create table stu3 as select * from stu;

根据已经存在的表结构创建表

create table stu4 like stu2;

查询表的类型

desc formatted  stu2;

删除表

drop table stu2;

外部表操作

在创建表的时候可以指定external关键字创建外部表,外部表对应的文件存储在location指定的hdfs目录下,向该目录添加新文件的同时,该表也会读取到该文件(当然文件格式必须跟表定义的一致)。
外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive外部表的时候,数据仍然存放在hdfs当中,不会删掉
数据装载载命令Load
语法:

load data [local] inpath '/export/data/datas/student.txt' [overwrite] | into table student [partition (partcol1=val1,)];

参数:
1、load data:表示加载数据
2、local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
3、inpath:表示加载数据的路径
4、overwrite:表示覆盖表中已有数据,否则表示追加
5、into table:表示加载到哪张表
6、student:表示具体的表
7、partition:表示上传到指定分区

创建外部表
数据准备
创建外部文件

01,张三 
02,李四 
03,王五

student.txt

01,赵雷,1990-01-01,男
02,钱电,1990-12-21,男
03,孙风,1990-05-20,男
04,李云,1990-08-06,男
05,周梅,1991-12-01,女
06,吴兰,1992-03-01,女
07,郑竹,1989-07-01,女
08,王菊,1990-01-20,

teacher.txt

创建teacher表

create external table teacher (tid string,tname string) row format delimited fields terminated by ',';

创建student表

create external table student (sid string,sname string,sbirth string , ssex string ) row format delimited fields terminated by ',';

从本地文件系统向表中加载数据

load data local inpath '/export/tmp/hive/teacher.txt' into table teacher;
load data local inpath '/export/tmp/hive/student.txt' into table student;

加载数据并覆盖已有数据

load data local inpath '/export/data/hivedatas/student.txt' overwrite  into table student;

从hdfs文件系统向表中加载数据
需要提前将数据上传到hdfs文件系统,

hadoop fs -mkdir -p /hivedatas
cd /export/data/hivedatas
hadoop fs -put student_hdfs.txt /hivedatas/

student_hdfs.txt

01,赵雷,1990-01-01,男
02,钱电,1990-12-21,男
03,孙风,1990-05-20,男
04,李云,1990-08-06,男
05,周梅,1991-12-01,女
06,吴兰,1992-03-01,女
07,郑竹,1989-07-01,女
08,王菊,1990-01-20,
create external table student_hdfs(sid string,sname string,sbirth string , ssex string ) row format delimited fields terminated by ',';
load data inpath '/hivedatas/student_hdfs.txt' into table student_hdfs;

在这里插入图片描述

复杂类型操作

Array是数组类型,Array中存放相同类型的数据
源数据:
说明:name与locations之间制表符分隔,locations中元素之间逗号分隔

zhangsan	  beijing,shanghai,tianjin,hangzhou
wangwu   	changchun,chengdu,wuhan,beijin

建表语句

create external table hive_array(name string, work_locations array<string>)
row format delimited fields terminated by '\t'
collection items terminated by  ',';

导入数据(从本地导入,同样支持从HDFS导入)

load data local inpath '/export/data/hivedatas/work_locations.txt' overwrite into table hive_array;
#load data inpath '/hivedatas/work_locations.txt' overwrite into table hive_array;

常用查询:
– 查询所有数据

select * from hive_array;

在这里插入图片描述

– 查询loction数组中第一个元素

select name, work_locations[0] location from hive_array;

在这里插入图片描述

– 查询location数组中元素的个数

select name, size(work_locations) location from hive_array;

在这里插入图片描述

– 查询location数组中包含tianjin的信息

select * from hive_array where array_contains(work_locations,'tianjin');

在这里插入图片描述

分区表

分区不是独立的表模型,要和内部表或者外部表结合:
内部分区表
外部分区表

基本操作
在大数据中,最常用的一种思想就是分治,分区表实际就是对应hdfs文件系统上的的独立的文件夹,该文件夹下是该分区所有数据文件。
分区可以理解为分类,通过分类把不同类型的数据放到不同的目录下。
分类的标准就是分区字段,可以一个,也可以多个。
分区表的意义在于优化查询。查询时尽量利用分区字段。如果不使用分区字段,就会全部扫描。
在查询是通过where子句查询来指定所需的分区。

在hive中,分区就是分文件夹

创建分区表语法

create table score(sid string,cid string, sscore int) partitioned by (month string) row format delimited fields terminated by '\t';

创建一个表带多个分区

create table score2 (sid string,cid string, sscore int) partitioned by (year string,month string,day string) row format delimited fields terminated by '\t';

数据准备

01	01	80
01	02	90
01	03	99
02	01	70
02	02	60
02	03	80
03	01	80
03	02	80
03	03	80
04	01	50
04	02	30
04	03	20
05	01	76
05	02	87
06	01	31
06	03	34
07	02	89
07	03	98

加载数据到分区表中

load data local inpath '/export/tmp/hive/score.txt' into table score partition (month='202006');

加载数据到一个多分区的表中去

load data local inpath '/export/tmp/hive/score.txt' into table score2 partition(year='2020',month='06',day='01');

多分区联合查询使用union all来实现

select * from score where month = '202006' union all select * from score where month = '202007';

查看分区

show  partitions  score;

添加一个分区

alter table score add partition(month='202008');

同时添加多个分区

alter table score add partition(month='202009') partition(month = '202010');

注意:添加分区之后就可以在hdfs文件系统当中看到表下面多了一个文件夹

删除分区

alter table score drop partition(month = '202010');

在这里插入图片描述

分桶表

分桶就是将数据划分到不同的文件,其实就是MapReduce的分区

基本操作
将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去

开启hive的桶表功能(如果执行该命令报错,表示这个版本的Hive已经自动开启了分桶功能,则直接进行下一步)

set hive.enforce.bucketing=true;

设置reduce的个数
set mapreduce.job.reduces=3; #该参数在Hive2.x版本之后不起作用

创建分桶表

create table course (cid string,c_name string,tid string) clustered by(cid) into 3 buckets row format delimited fields terminated by '\t';

桶表的数据加载,由于桶表的数据加载通过hdfs dfs -put文件或者通过load data均不好使,只能通过insert overwrite

创建普通表,并通过insert overwrite的方式将普通表的数据通过查询的方式加载到桶表当中去

创建普通表:

create table course_common (cid string,c_name string,tid string) row format delimited fields terminated by '\t';

普通表中加载数据

load data local inpath '/export/data/hivedatas/course.txt' into table course_common;

通过insert overwrite给桶表中加载数据

insert overwrite table course select * from course_common cluster by(cid);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值