文章目录

  • 前言
  • 一、Hive基本数据类型
  • 二、Hive集合数据类型
  • 三、Hive数据定义与操作
  • 1.创建数据库
  • 2.查看数据库
  • 3.删除数据库
  • 4.创建表
  • 5.修改表
  • 6.删除表
  • 7.分区表
  • 四、数据的导入导出
  • 1.数据导入
  • 2.数据导出


前言

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


一、Hive基本数据类型

数据类型

长度

例子

TINYINT

1byte有符号整数

30

SMALLINT

2byte 有符号整数

30

INT

4byte 有符号整数

30

BIGIN

8byte有符号整数

30

BOOLEAN

布尔类型true 或者 false

true

FLOAT

单精度浮点数

3.14159

DOUBLE

双精度浮点数

3.14159

STRING

字符序列,可以指定字符集可以使用单引号或双引号

“have a good day”

TIMESTAMP

整数、浮点数或者字符串

1550738998125(Unix 新纪元秒)

BINARY

字节数组

属于集合类型

二、Hive集合数据类型

数据类型

描述

字面语法事例

STRUCT

与C语言中的结构体struct类型相似,都可以通过"点"符号访问元素内容。例如,某表中某个列的数据类型为STRUCT(firNameSTRING, lastName STRING),那么第一个元素可通过字段名.firName 来引用

STRUCT(“zhao”, “si”)

MAP

MAP是一个键值对映射集合。例如,表中某个列的数据类型是MAP,存放数据的格式是键→值,通过键就可以获取值,“Salary” → “8000”

MAP(“Salary”, “10000”, “food”, “100”)

ARRAY

ARRAY数组是一组具有相同类型变量的集合,这些变量被称为数组的元素,每个元素都有一个下标编号,编号从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

hive 能修改数据吗 hive支持修改数据吗_hadoop

路径的最后就是表名,删除表后,路径也会被删除。

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 ',';

hive 能修改数据吗 hive支持修改数据吗_大数据_02


导入数据:

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

导入效果

hive 能修改数据吗 hive支持修改数据吗_hive_03


查看表stu在HDFS上的目录结构:查看所在数据库的目录:

hive 能修改数据吗 hive支持修改数据吗_数据仓库_04

根据所在数据库目录查看表在HDFS上的目录结构:

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

hive 能修改数据吗 hive支持修改数据吗_数据仓库_05

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

hive 能修改数据吗 hive支持修改数据吗_数据仓库_06

可以看到,又新增了~/grade=second目录

hive 能修改数据吗 hive支持修改数据吗_hive 能修改数据吗_07

(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数据导出