0


【HIVE】数据的定义与操作

文章目录

前言

Hive作为数据仓库,用来存放企业的海量数据,Hive提供了丰富的数据类型,如关系型数据库,且提供了关系型数据库不支持的数据类型。


一、Hive基本数据类型

数据类型长度例子TINYINT1byte有符号整数30SMALLINT2byte 有符号整数30INT4byte 有符号整数30BIGIN8byte有符号整数30BOOLEAN布尔类型true 或者 falsetrueFLOAT单精度浮点数3.14159DOUBLE双精度浮点数3.14159STRING字符序列,可以指定字符集可以使用单引号或双引号“have a good day”TIMESTAMP整数、浮点数或者字符串1550738998125(Unix 新纪元秒)BINARY字节数组属于集合类型

二、Hive集合数据类型

数据类型描述字面语法事例STRUCT与C语言中的结构体struct类型相似,都可以通过"点"符号访问元素内容。例如,某表中某个列的数据类型为STRUCT(firNameSTRING, lastName STRING),那么第一个元素可通过字段名.firName 来引用STRUCT(“zhao”, “si”)MAPMAP是一个键值对映射集合。例如,表中某个列的数据类型是MAP,存放数据的格式是键→值,通过键就可以获取值,“Salary” → “8000”MAP(“Salary”, “10000”, “food”, “100”)ARRAYARRAY数组是一组具有相同类型变量的集合,这些变量被称为数组的元素,每个元素都有一个下标编号,编号从0开始,例如数组[“Salary”,“Late”]ARRAY(“Salary”, “food”)

三、Hive数据定义与操作

1.创建数据库

create database stutest;

为避免报错,可以使用以下语句:

create database if not exists stutest;

创建同时增加描述:

create database stutest comment 'for test';

2.查看数据库

show databases;

匹配数据库名

show databases like 's.*';

查看数据库描述(输出描述信息包括Hive为数据库stutest在HDFS分布式文件系统上创建的目录):

describe database stutest;

3.删除数据库

drop database;

为避免报错,可以使用以下语句:

drop database if exists stutest;

如果数据库里包含一张或多张表,需要把表

全删除

,才能删除数据库。也可以直接在命令后加上关键字cascade,将自行先删除表,再删除数据库。

drop database if exists sogou cascade;

4.创建表

create table school.student(id bigint,name string,score double,age int) row format delimited fields terminated by ',';
row delimited fields

定义行格式化分隔,

terminated by

','表示每一列之间的分隔符为都好(也可以定义其他如‘\t’)。
同时也可以加入更多后缀如下;

create table school.student(id bigint,name string,score double,age int) row format delimited fields terminated by ',' location '/user/hive/warehouse/stutest.db/school';

其中

/user/hive/warehouse/

是默认数据仓库路径地址,

stutest.db

是数据库目录,

school

是表目录,

/user/hive/warehouse/stutest.db

就是在HDFS文件系统上的数据库目录。

(1)管理表
导入数据代码如下:

load data local inpath '/home/oliver/data/student.txt' into table student;

查看数据库中的数据表内容:

show tables in stustudent;

也可以直接使用Hadoop命令查看数据表信息:

hadoop fs -ls hdfs://localhost:9000/user/hive/warehouse/stutest.db

在这里插入图片描述路径的最后就是表名,删除表后,路径也会被删除。

2.外部表

在创建表时,如果加上关键字external,则创建为外部表。外部表中的数据生命周期不受Hive的控制,且可以和其他外部表进行数据的共享。Hive 创建外部表的语法如下所示,我们创建一张产品表。

 create external table uuser(user_name string, user_id bigint) row format delimited fields terminated by '\t' location '/data/test';//ex-ternal关键字定义创建的表为外部表,location '/data/test'定义外部表test存放数据的HDFS 路径地址。

Hive数据库中uuser表被删除之后,表uuser在HDFS上存放数据的目录上的

/data/test/uuser.txt

文件不会被删除,在实际开发过程中,外部表external是主要的应用类型。

5.修改表

重命名表:

alter table stutest rename to stu;

增加表字段:

alter table stu add columns(sex string,height float);

6.删除表

drop table stu;

删除表的过程中,只是删除表的元信息,对于外部表只会删除表元信息,表目录信息不会被删除。对于管理表则表元信息与表目录数据信息一同删除。

7.分区表

解决数据量过大产生的数据库性能问题,主要有创建分表和创建分区表两种方式。

创建分表

是将一张大表数据分配到多张小表中,提高数据并法量,但一张表结构发生变化,则其他表都会发生变化,需要较高的sql代码维护成本。

创建分区表

,是所有数据还在同一张数据表中,但底层物理存储数据根据一定的规则,划分到不同文件中(文件还可存储到不同的磁盘上)。使用表分区技术水平分散压力,将数据从物理上移动到距离使用最频繁的用户更近的地方,缺点是表的并法量没有提高。
Hive的分区就是创建层级目录的一种方式。

(1)静态分区
创建静态分区表

stu

并且该表只有一个分区,分区列

grade

:

create table stu(id int,name string) partitioned by(grade string) row format delimited fields terminated by ',';

在这里插入图片描述
导入数据:

1,赵
2,钱
3,孙
load data local inpath '/home/oliver/data/stu_1.txt' into table stu partition(grade='first');

导入效果
在这里插入图片描述
查看表stu在HDFS上的目录结构:

查看所在数据库的目录:
在这里插入图片描述根据所在数据库目录查看表在HDFS上的目录结构:

hadoop fs -lsr /user/hive/warehouse/stutest.db;

在这里插入图片描述根据目录可知,在Hive数据仓库默认路径上会创建表明目录的同时,还创建一个分区名子目录,最后在分区名下存放那个世纪数据XX.txt。

继续导入:
在这里插入图片描述可以看到,又新增了

~/grade=second

目录
在这里插入图片描述

(2)动态分区
动态分区区别与静态分区的表现为不用指定分区目录,由系统自己选择。

开启动态分区:

set hive.exec.dynamic.partition=true;

将所有分区列设置为动态:

set hive.exec.dynamic.partition.mode=nonstrict;//默认是strict

设置最大分区个数:

set hive.exec.max.dynamic.partitions.pernode=1000;//最大分区个数

检验:
创建分区表

create table student(id int) partitioned by(name string,grade string) row format delimited fields terminated by ',';

将数据导入空表(insert overwrite)

insert overwrite table student partition(name,grade) select id,name,grade from stu;

四、数据的导入导出

1.数据导入

除了使用HiveQL语句向表中传入数据外,可以通过HDFS命令行接口直接将xxx.txt数据导入Hive表,原理是将数据文件放到LOCATION属性所指向路径:

hadoop fs -put xxx.txt /stutest/stu

2.数据导出

将数据从Hive仓库导出至本地,就是从HDFS导出数据(通过HDFS命令行接口),操作如下

hadoop fs get /user/hive/warehouse/stutest.db/stu/xxx  //将表stu数据导出

本文转载自: https://blog.csdn.net/weixin_42594598/article/details/134933766
版权归原作者 奥利文儿 所有, 如有侵权,请联系我们删除。

“【HIVE】数据的定义与操作”的评论:

还没有评论