数据库(Databases)

数据库是表的集合,在HDFS中体现为一个同数据库名的文件夹,例如mydemo.db文件夹,默认存放在hive.metastore.warehouse.dir指向的数据仓库地址中(在hive-site.xml中指定,是HDFS文件夹)。

hive-site.xml文件中:
<property>
	<name>hive.metastore.warehouse.dir</name>
	<value>/usr/hive/warehouse</value>
</property>

HDFS查看文件夹。

hive中创建表不保存 hive的表存放在哪里_hive


如何知道当前工作在哪个数据库?

hive > select current_database(); 				//查询显示当前数据库
 hive > set hive.cli.print.current.db = true;		//设定显示当前数据库名

hive中创建表不保存 hive的表存放在哪里_HDFS_02

Hive数据类型

原始数据类型

类型

示例

TINYINT

10Y

SMALLINT

10S

INT

10

BIGINT

100L

FLOAT

1.342

DOUBLE

1.234

DECIMAL

3.14

BINARY

1010

BOOLEAN

TRUE

STRING

'Books’or"Books"

CAHR

'YES’or"YES"

VARCHAR

'Books’or"Books"

DATE

‘2020-05-29’

TIMESTAMP

‘2020-06-02 23:34:00.123’

复杂数据类型

类型

格式

定义

示例

Array

[‘Apple’,‘Orange’]

Array<string>

a[0] = ‘Apple’

Map

{‘A’:‘Apple’,‘O’:‘Orange’}

Map<string,string>

b[‘A’] = ‘Apple’

Struct

{‘Apple’,2}


Struct<fruit:stgring,weight:int>

c.weight = 2

array:存储相同数据类型的数据
map:具有相同类型的键值对
struct:封装一组字段

数据表(Tables)

分类:内部表、外部表
两者区别
内部表:managed table

  • 表中数据由Hive自身管理 在删除表(元数据)的同时也会删除数据
  • 数据存储位置:数据库对应HDFS文件中(若使用default数据库,则直接存放在/user/hive/warehouse中)
  • 适用情景:不需要共享数据的情景(存储数据统计分析的结果数据)

外部表:external table

  • 表中数据由HDFS管理 删除表(元数据)的时候,数据不会删除
  • 数据存储位置:自定义(location),(若无location,则在数据库对应HDFS的文件夹下建立一个与表同名的子文件夹,数据存放在此)
  • 适用情景:数据共享的情景(存储数据统计时的源数据)

元数据(metastore)

  • 元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
  • 默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore,可以在安装的时候,进行相应配置,以使用 MySQL 存储元数据。

Hive 元数据结构

数据结构

描述

逻辑关系

HDFS物理存储

Database

数据库

集合

文件夹

Table


行数据的集合

文件夹

Partition

分区

用于分割数据

文件夹

Buckets

分桶

用于分布数据

文件

Row


行记录

文件中的行

Columns


列记录

每行中指定的位置

Views

视图

逻辑概念,可跨越多张表

不存储数据

Index

索引

记录统计数据信息

文件夹

Hive创建表

建表语句规则如下:

hive中创建表不保存 hive的表存放在哪里_HDFS_03

字段说明:

(1)CREATE TABLE:创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据
仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删
除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY:创建分区表
(5)CLUSTERED BY:创建分桶表
(6)SORTED BY:不常用
(7)ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] 
[LINES TERMINATED BY char]| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, 
property_name=property_value, ...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。
在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive 通过 SerDe 确定表的具体的列的数据。
(8)STORED AS 指定存储文件类型常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,可以使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在 HDFS 上的存储位置。
(10)LIKE 允许用户复制现有的表结构,但是不复制数据。

创建内部表(管理表)

create table studentinfo1(
sid int,
sname string,
age int)
row format delimited fields terminated by ','
stored as textfile;

创建外部表 external修饰

create external table student1(
sid int,
sname string,
 class_id int )
row format delimited fields terminated by ','
location '/testdata';

show tables 可以在数据库中查看到两个表已成功创建。

hive中创建表不保存 hive的表存放在哪里_HDFS_04

这时查看HDFS文件(刷新),内部表studentinfo1对应在/usr/hive/warehouse/mydemo.db中,是一个文件夹,外部表student1即/testdata文件夹。

hive中创建表不保存 hive的表存放在哪里_数据_05

hive中创建表不保存 hive的表存放在哪里_hive中创建表不保存_06

查看表结构

desc formatted table_name

desc formatted sutdentinfo1 内部表(管理表)
表类型managed 存储路径location(建表时未指定)默认数据库文件下自动创建同表名文件夹。

hive中创建表不保存 hive的表存放在哪里_HDFS_07


desc formatted sutdent1 外部表

表类型external,存储路径location自定义路径/testdata

hive中创建表不保存 hive的表存放在哪里_HDFS_08

表数据填充(内外表皆可) 以内部表studentinfo1举例

1.增量方式 insert into 每一次增加都在表已有数据后新增记录,原有数据不变。

hive (mydemo)> insert into studentinfo1 values(1,'cm',15),(2,'dd',16),(3,'dai',15);
hive (mydemo)> select * from studentinfo1;
OK
1	cm	15
2	dd	16
3	dai	15

2.全量方式 insert overwrite 以新增数据覆盖表中原有数据,改变表原有数据。

hive (mydemo)> insert overwrite table studentinfo1 values(4,'wang',20);
hive (mydemo)> select * from studentinfo1;
OK
4	wang	20

增量和全量方式向表中增加数据,数据对应在HDFS文件中的一个文件000000_0。

hive中创建表不保存 hive的表存放在哪里_数据_09

3.装载 load data
load data [local] inpath file [insert/overwrite] into table table_name
选用local,则使用虚拟机中的本地文件
举例:将linux中/opt/student1.csv文件覆盖到studentinfo1表中

hive (mydemo)> !cat /opt/student1.csv;//加!使用linux中的命令
hive (mydemo)> load data local inpath '/opt/student1.csv' overwrite into table studentinfo1;
hive (mydemo)> select * from studentinfo1;

hive中创建表不保存 hive的表存放在哪里_hive中创建表不保存_10

使用load装载文件数据到表中时,表数据对应HDFS文件中是装载文件的形式student1.csv。

hive中创建表不保存 hive的表存放在哪里_HDFS_11

4.文件数据上传到HDFS文件中

truncate table studentinfo1;//清空表数据(千万不要在工作中轻易使用!!!)这时候查看HDFS文件中studentinfo1文件中已没有数据文件。查询表为空。

hive (mydemo)> truncate table studentinfo1;
hive (mydemo)> select * from studentinfo1;
hive (mydemo)> !hdfs dfs -put /opt/student1.csv /usr/hive/warehouse/mydemo.db/studentinfo1;//数据文件上传到HDFS中表数据的存储位置中
hive (mydemo)> select * from studentinfo1;//表中有数据

hive中创建表不保存 hive的表存放在哪里_数据_12

删除表(元数据)

删除内、外表(内外表都先给一些数据)

drop table table_name

hive中创建表不保存 hive的表存放在哪里_hive中创建表不保存_13

内、外表的结构(元数据)已被删除,表已经不存在了。

hive中创建表不保存 hive的表存放在哪里_数据_14


查看各表的HDFS数据文件,内部表数据文件已删除,外部表数据还存在。

hive中创建表不保存 hive的表存放在哪里_hive中创建表不保存_15

hive中创建表不保存 hive的表存放在哪里_hive_16